HttpClient源码解析系列一:概括及使用

发布时间:2026/7/28 16:03:44
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使用很简单下一篇我们来分析一下执行的原理和源码的解读