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/7/29 17:33:32 阅读更多 →
使用mock(沙箱)进行支付测试

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

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

2026/7/28 16:03:48 阅读更多 →
7月28日热点:一个周末,二十年护城河——Claude攻破CUDA

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

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

2026/7/29 17:33:56 阅读更多 →

最新新闻

Windows多显示器DPI缩放终极指南:SetDPI解决你的显示缩放烦恼

Windows多显示器DPI缩放终极指南:SetDPI解决你的显示缩放烦恼

Windows多显示器DPI缩放终极指南:SetDPI解决你的显示缩放烦恼 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 你是否曾经为Windows系统在多显示器环境下的DPI缩放问题而烦恼?主显示器上文字清晰锐利,切…

2026/7/29 17:34:27 阅读更多 →
WPF应用实战开发指南 - 如何完成附件管理

WPF应用实战开发指南 - 如何完成附件管理

在我们之前的开发框架中,往往都是为了方便,对附件的管理都会进行一些简单的封装,目的是为了方便快速的使用,并达到统一界面的效果。本文主要介绍基于SqlSugar开发框架的WPF应用端,对于附件展示和控件的一些封装处理界面…

2026/7/29 17:34:27 阅读更多 →
性能优化:让系统“跑得更快“

性能优化:让系统“跑得更快“

性能优化:让系统"跑得更快" 你开车上班: 原来30分钟到 现在想25分钟到 可以换车、可以换路线、可以早点出门 性能优化就是让系统从"30分钟"变成"25分钟"的过程。 性能优化的原则 1. 先测量,再优化 不要猜,要用数据: 猜测:数据库慢 实…

2026/7/29 17:34:27 阅读更多 →
界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(下)

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(下)

DevExpress WPF的Side Navigation(侧边导航)、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar(导航栏),DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

2026/7/29 17:34:27 阅读更多 →
如何解决背光升压电路EMI问题

如何解决背光升压电路EMI问题

一、前言随着仪表市场需求日益旺盛与产品功能日趋复杂,其电磁兼容性问题也愈发凸显。其中,背光电路的EMI干扰尤为普遍。本文将通过一个实际案例,深入分析并展示该问题的有效解决方案。二、整改案例下图是一款仪表类设备的EMI测试数据&#xf…

2026/7/29 17:34:27 阅读更多 →
MAA明日方舟助手:重新定义游戏自动化的终极开源解决方案

MAA明日方舟助手:重新定义游戏自动化的终极开源解决方案

MAA明日方舟助手:重新定义游戏自动化的终极开源解决方案 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://g…

2026/7/29 17:33:27 阅读更多 →

日新闻

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:00:23 阅读更多 →
AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础

AI编程系列02:合并知识功能,给 AI 问数和 RAG 场景打基础 在上一期「AI编程系列」中,我们学习了如何构建一个基础的 AI 问答系统,通过简单的输入输出让模型回应问题。但现实世界中的 AI 应用往往需要处理更复杂的场景:…

2026/7/29 0:00:23 阅读更多 →
AI智能体开发实战:从工具调用到企业级部署

AI智能体开发实战:从工具调用到企业级部署

1. 从被动问答到主动执行:AI Agent的范式转变过去两年,大语言模型最显著的应用形态是聊天机器人——用户提问,AI回答。但真正的生产力革命发生在2023年下半年:当AI学会主动调用工具完成任务时,生产力工具的历史被彻底改…

2026/7/29 0:00:23 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻