HttpClient源码解析系列一:概括及使用
一、简单介绍下Http, tcp/ip和socket区别首先看一下无处不在的OSI七层传输模型第一层应用层。定义了用于在网络中进行通信和传输数据的接口Http协议位于该层第二层表示层。定义不同的系统中数据的传输格式编码和解码规范等第三层会话层。管理用户的会话控制用户间逻辑连接的建立和中断第四层传输层。管理着网络中的端到端的数据传输Tcp协议位于该层第五层网络层。定义网络设备间如何传输数据IP位于该层第六层链路层。将上面的网络层的数据包封装成数据帧便于物理层传输第七层物理层。这一层主要就是传输这些二进制数据。看字面也能理解个差不多知道个大概就行可以自行百度。Tcp/ip是传输层协议而http则是建立在它之上的上层应用协议。Http聚焦在数据规范层面tcp/ip则主要解决数据传输层面。建立在tcp/ip上的应用协议很多我们经常接触的像rpcftp等。Socket则是tcp/ip的一个编程实现封装了传输层的众多细节从而让协议层可以关注协议本身的处理而不用关注底层传输。在程序里http请求连接最终一定需要绑定到一个具体的socket连接进行上行和下行传输。二、HttpClient特点纯Java语言实现的HTTP。以可扩展的面向对象的结构实现了HTTP全部的方法GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE。支持加密的HTTPS协议HTTP通过SSL协议。通过HTTP代理方式建立透明的连接。利用CONNECT方法通过HTTP代理建立隧道的HTTPS连接。Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。插件式的自定义认证方案。可插拔的安全套接字工厂使得接入第三方解决方案变得更容易连接管理支持使用多线程的的应用。支持设置最大连接数同时支持设置每个主机的最大连接数发现并关闭过期的连接。自动化处理Set-Cookie来自服务器的头并在适当的时候将它们发送回cookie。可以自定义Cookie策略的插件化机制。Request的输出流可以避免流中内容体直接从socket缓冲到服务器。Response的输入流可以有效的从socket服务器直接读取相应内容。在HTTP1.0和HTTP1.1中使用用KeepAlive来保持持久连接。可以直接获取服务器发送的响应码和响应头部。具备设置连接超时的能力。支持HTTP/1.1 响应缓存。源代码基于Apache License 可免费获取三、一般使用步骤:a)HttpGet请求响应:1). 创建HttpClient对象,可以使用HttpClients.createDefault()2). 如果是无参数的GET请求则直接使用构造方法HttpGet(String url)创建HttpGet对象即可如果是带参数GET请求则可以先使用URIBuilder(String url)创建对象再调用addParameter(String param, String value)或setParameter(String param, String value)来设置请求参数并调用build()方法构建一个URI对象。只有构造方法HttpGet(URI uri)来创建HttpGet对象。3). 创建HttpResponse调用HttpClient对象的execute(HttpUriRequest request)发送请求该方法返回一个HttpResponse。调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头调用HttpResponse的getEntity()方法可获取HttpEntity对象该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()可以获取响应状态码。4). 释放连接。b)HttpGet请求响应:1). 创建HttpClient对象,可以使用HttpClients.createDefault()2). 如果是无参数的POST请求则直接使用构造方法HttpPost(String url)创建HttpPost对象即可如果是带参数POST请求先构建HttpEntity对象并设置请求参数然后调用setEntity(HttpEntity entity)创建HttpPost对象。3). 创建HttpResponse调用HttpClient对象的execute(HttpUriRequest request)发送请求该方法返回一个HttpResponse。调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头调用HttpResponse的getEntity()方法可获取HttpEntity对象该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()可以获取响应状态码。4). 释放连接。四、简单使用实例:1.get请求public void httpClientTestGet() { CloseableHttpClient httpClient HttpClients.createDefault(); try { // 创建HttpGet HttpGet httpGet new HttpGet(http://www.baidu.com/); // 执行get请求 CloseableHttpResponse response null; response httpClient.execute(httpGet); try { // 获取详情实体 HttpEntity entity response.getEntity(); //打印响应状态 System.out.println(response.getStatusLine()); if (entity ! null) { // 打印内容长度和内容 System.out.println(内容长度 entity.getContentLength()); System.out.println(响应内容 EntityUtils.toString(entity)); } } finally { response.close(); } } catch ( IOException e) { e.printStackTrace(); } finally { // 关闭连接,释放资源 try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } }2.post请求public void postFormTest() throws IOException { System.out.println(); // 创建默认的httpClient实例 CloseableHttpClient client HttpClients.createDefault(); // 创建post请求 HttpPost post new HttpPost(http://localhost:8765/user//direct/airinfo/list); // 设置请求参数 MapString, String map new HashMapString, String(); map.put(userName, 张三); map.put(realName, zhangsan); StringEntity stringEntity new StringEntity(JSON.toJSONString(map), ContentType.APPLICATION_JSON); stringEntity.setContentEncoding(utf-8); post.setEntity(stringEntity); post.releaseConnection(); // 执行请求 CloseableHttpResponse response client.execute(post); // 获取结果 if (response.getStatusLine().getStatusCode()! HttpStatus.SC_OK){ System.out.println(请求出错状态为response.getStatusLine().getStatusCode()); } System.out.println(EntityUtils.toString(response.getEntity())); // 释放链接 response.close(); }HttpClient使用很简单下一篇我们来分析一下执行的原理和源码的解读

相关新闻

5分钟免费获取QQ空间历史说说的完整指南:GetQzonehistory工具使用教程

5分钟免费获取QQ空间历史说说的完整指南:GetQzonehistory工具使用教程

5分钟免费获取QQ空间历史说说的完整指南:GetQzonehistory工具使用教程 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾在深夜翻看QQ空间,想要找回那些记…

2026/7/28 16:01:41阅读更多 →
基于Windows音频API的麦克风静音控制技术:MicMute架构设计与实现原理

基于Windows音频API的麦克风静音控制技术:MicMute架构设计与实现原理

基于Windows音频API的麦克风静音控制技术:MicMute架构设计与实现原理 【免费下载链接】MicMute Mute default mic clicking tray icon or shortcut 项目地址: https://gitcode.com/gh_mirrors/mi/MicMute MicMute是一个基于C#和Windows音频API构建的轻量级麦…

2026/7/28 16:01:41阅读更多 →
HFS文件服务器终极指南:如何快速搭建个人云存储系统

HFS文件服务器终极指南:如何快速搭建个人云存储系统

HFS文件服务器终极指南:如何快速搭建个人云存储系统 【免费下载链接】hfs HFS is a web file server for your computer. Share folders or even a single file thanks to the virtual file system. 项目地址: https://gitcode.com/gh_mirrors/hf/hfs 还在为…

2026/7/28 16:01:41阅读更多 →
600万年薪抢疯了!大模型人才火爆,小白也能入局,速收藏!

600万年薪抢疯了!大模型人才火爆,小白也能入局,速收藏!

大厂争抢AI人才,大模型算法成热招岗位第一,AI科学家月薪破10万。企业看重实干能力,博士实习日薪超千元。AI人才分三类:A类核心技术人才,B类应用开发人才,C类AI使用者。普通理工科学生可切入B类,…

2026/7/28 17:19:57阅读更多 →
##将一个字符的前n个字符左旋##判断一个字符串是否为另外一个字符串旋转之后的字符串。

##将一个字符的前n个字符左旋##判断一个字符串是否为另外一个字符串旋转之后的字符串。

实现一个函数,可以左旋字符串中的k个字符。 ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 思路如下:先将要左旋的k个字符逆置,然后将k个字符之后的字符逆置,左后将整个字符串逆置。1.逆置字符串的函数void reverse(char …

2026/7/28 17:19:57阅读更多 →
基于线段树的RMQ

基于线段树的RMQ

每个节点维护的是区间的最小值#include <cstdio> #include <iostream> #include <vector> #include <cmath> #include <queue> #include <algorithm> #include <cstring>typedef long long ll; const int INF 1e6; const int maxn…

2026/7/28 17:19:57阅读更多 →
基础Demo_02数据运算符(学习笔记)

基础Demo_02数据运算符(学习笔记)

算术运算图中代码 public class Demo01_YurnSuan {public static void main(String[] args){System.out.println(10 20); // 30System.out.println(10 - 20); // -10System.out.println(10 * 20); // 200System.out.println(10 / 20); // 整数与整数运算,结果还是整数System.o…

2026/7/28 17:19:57阅读更多 →
如何选择适合自己的编程语言?这个操作厉害了

如何选择适合自己的编程语言?这个操作厉害了

Twitter上流传的《编程语言选择指导图》&#xff0c;非常具有参考性。大家可以通过这张图做个小测试&#xff0c;看看自己更适合哪种编程语言。 学习编程&#xff0c;首先要选择一门编程语言&#xff0c;但是初学者往往在这个环节产生迷茫&#xff0c;不知道该如何选择。 下面的…

2026/7/28 17:19:57阅读更多 →
开源一套.NET平台的Excel COM 组件二次封装库

开源一套.NET平台的Excel COM 组件二次封装库

开源一套.NET平台的Excel COM 组件二次封装库 在日常的企业级开发中&#xff0c;Excel 文件的读写是一个高频需求。虽然 .NET 平台提供了多种方式操作 Excel&#xff0c;如 NPOI、EPPlus 或 OpenXML&#xff0c;但在某些场景下&#xff08;如调用 VBA 宏、保留复杂格式、与旧系…

2026/7/28 17:17:57阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

&#x1f539; 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具&#xff0c;凭借本地离线运行、可视化图形操作和任务自动化三大核心特性&#xff0c;赢得了众多用户的青睐。与普通在线对话AI工具不同&#xff0c;它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接&#xff0c;是用激光束对阀座壳体&#xff08;通常为不锈钢或铝合金&#xff09;进行密封焊接&#xff0c;使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX&#xff1a;三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿&#xff01;3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑&#xff1a;把几百页的财报、法规、技术手册扔给向量库&#xff0c;问一个具体问题&#xff0c;搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了&#xff0c;要么藏在几十条结果的最下面。语义相似≠真正相关&#xff0c;这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营&#xff0c;从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候&#xff0c;每天刷半小时抖音&#xff0c;手动把爆款视频的口播敲进备忘录&#xff0c;一条2分钟的视频得花十来分钟&#xff0c;碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →