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使用很简单下一篇我们来分析一下执行的原理和源码的解读

相关新闻

NBM5100A与STM32F732IE的低功耗物联网电源管理方案

NBM5100A与STM32F732IE的低功耗物联网电源管理方案

1. NBM5100A与STM32F732IE的协同工作架构解析在低功耗物联网设备设计中,纽扣电池供电系统面临两个核心挑战:有限的能量储备和瞬间大电流需求。Nexperia的NBM5100A电池寿命增强器与STM32F732IE微控制器的组合,为这一难题提供了创新解决方案。这…

2026/9/23 0:38:49 阅读更多 →
使用mock(沙箱)进行支付测试

使用mock(沙箱)进行支付测试

文章目录支付测试的两种方案电脑端支付的测试点测试环境上设置模拟支付平台(也称沙箱)的接口地址沙箱账号测试使用登录账户付款测试使用手机扫码付款参考资料支付测试的两种方案 1)使用真实支付平台进行小额支付,直接扣你支付宝/…

2026/9/22 0:19:44 阅读更多 →
7月28日热点:一个周末,二十年护城河——Claude攻破CUDA

7月28日热点:一个周末,二十年护城河——Claude攻破CUDA

一个周末,二十年护城河2026年7月的最后一个周末,Anthropic的一名叫Tom Brown的工程师做了件不太寻常的事。AMD送来了一台搭载MI355X GPU的机架。这是AMD最新的加速卡,新鲜到连软件栈都还带着出厂温度。按照以往的经验,适配新硬件至…

2026/9/19 1:55:41 阅读更多 →

最新新闻

换热站工作原理:面试必问的5个核心考点,一次讲透

换热站工作原理:面试必问的5个核心考点,一次讲透

换热站工作原理:面试必问的5个核心考点,一次讲透 刚入行搞供热或者暖通,是不是经常感觉“书都背了,一到现场就懵”?很多兄弟在面试时被问到换热站工作原理,能背出“一次网进水、二次网出水”,但面试官稍微一追问“为什么二次网流量大,压力就掉得这么…

2026/9/23 0:38:50 阅读更多 →
NXPI电子证书实操:3个避坑指南助你通过执业合规检查

NXPI电子证书实操:3个避坑指南助你通过执业合规检查

NXPI电子证书实操:3个避坑指南助你通过执业合规检查 凌晨两点,盯着屏幕上滚动的 System.Exception 和 NXPI.Certificate.InvalidStatus 报错,你盯着那串看不懂的 StackTrace…

2026/9/23 0:38:50 阅读更多 →
首席执行官观后感避坑指南:5个高频坑点助你通关

首席执行官观后感避坑指南:5个高频坑点助你通关

首席执行官观后感避坑指南:5个高频坑点助你通关 复制来的代码跑不通,报错日志看了一堆还是没头绪?别慌,这种“首席执行官观后感”式的混乱代码在面试突击里太常见了。今天这篇避坑指南,专治各种不服。 考点梳理:到底在考什么…

2026/9/23 0:38:50 阅读更多 →
米帅配置卡半天?这份速查手册让你5分钟搞定

米帅配置卡半天?这份速查手册让你5分钟搞定

米帅配置卡半天?这份速查手册让你5分钟搞定 是不是刚接手“米帅”相关项目,或者在本地搭环境时, npm install 转了十分钟,终端里全是红色的 ERR! 报错?那种看着依赖树乱成一锅粥,想删掉重装又怕删坏系统的感觉,真的太磨人了。…

2026/9/23 0:38:50 阅读更多 →
97亚洲综合色成在线观看图解原理:3个常见报错调通指南

97亚洲综合色成在线观看图解原理:3个常见报错调通指南

97亚洲综合色成在线观看图解原理:3个常见报错调通指南 复制来的代码跑不通不知道怎么调,是不是你每天打开IDE后的第一反应?很多刚接触编程的学员,或者转行过来的朋友,最常遇到的坑就是:从网上、从课程、从朋友那里复制了一段看似完美的代码,粘到…

2026/9/23 0:38:50 阅读更多 →
电信合约机0元购机系统卡顿?面试必问的3步优化实战

电信合约机0元购机系统卡顿?面试必问的3步优化实战

电信合约机0元购机系统卡顿?面试必问的3步优化实战 刚把那段“高并发抢购”代码从网上扒下来,一跑直接报 Connection pool exhausted…

2026/9/23 0:37:50 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/22 4:32:41 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/22 4:38:57 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/22 8:51:04 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →