HttpClient
HTTP 协议的重要性不言而喻,它是现在 Internet 中使用最多,最重要的协议了。虽然 JDK 中已经提供了 HTTP 协议的基本功能,但对于大部分应用来说,这套 API 还是不够丰富和灵活。
HttpClient 是用来编程实现 HTTP 调用的一款框架,它是 Apache Jakarta Common 下的子项目,相比传统 JDK 自带的 URLConnection,增加了易用性和灵活性。
HttpClient 不仅使客户端发送 Http 请求变得更加容易,而且也方便了开发人员测试接口(基于 Http 协议的),即提高了开发的效率,也方便提高代码的健壮性。
目前主流的 SpringCloud 框架,服务与服务之间的调用也全部是基于 HttpClient 来实现的。因此,系统的学习一下 HttpClient,还是非常有必要的。
HttpClient 功能及特性
HttpClient 主要提供了以下功能及特性实现:
- 基于标准、纯净的 java 语言。实现了 HTTP 1.0 和 HTTP 1.1;
- 以可扩展的面向对象的结构实现了 HTTP 全部的方法(GET、 POST、PUT、DELETE、HEAD、OPTIONS、TRACE)等。
- 支持 HTTPS 协议。
- 通过 HTTP 代理建立透明的连接。
- 利用 CONNECT 方法通过 HTTP 代理建立隧道的 HTTPs 连接。
- Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 认证方案。
- 插件式的自定义认证方案。
- 便携可靠的套接字工厂使它更容易的使用第三方解决方案。
- 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
- 自动处理 Set-Cookie 中的 Cookie。
- 插件式的自定义 Cookie 策略。
- Request 的输出流可以避免流中内容直接缓冲到 Socket 服务器。
- Response 的输入流可以有效的从 Socket 服务器直接读取相应内容。
- 在 HTTP 1.0 和 HTTP1.1 中利用 KeepAlive 保持持久连接。
- 直接获取服务器发送的 response code 和 headers。
- 设置连接超时的能力。
- 实验性的支持 HTTP1.1 response caching。
- 源代码基于 Apache License 可免费获取。
- 支持自动(跳转)转向;
关于以上特性,了解即可,用到时再进行深入学习和实践。
HttpClient 使用步骤
使用 HttpClient 来发送请求、接收响应通常有以下步骤:
- 引入依赖:项目中通过 Maven 等形式引入
HttpClient
依赖类库。 - 创建
HttpClient
对象。 - 创建请求方法实例:GET 请求创建
HttpGet
对象,POST 请求创建HttpPost
对象,并在对象构建时指定请求 URL。 - 设置请求参数:调用
HttpGet
、HttpPost
共同的setParams(HetpParams params)
方法来添加请求参数;HttpPost
也可调用setEntity(HttpEntity entity)
方法来设置请求参数。 - 发送请求:调用
HttpClient
对象的execute(HttpUriRequest request)
发送请求,该方法返回一个HttpResponse
。 - 获取响应结果:调用
HttpResponse
的getAllHeaders()
、getHeaders(String name)
等方法获取服务器的响应头;调用HttpResponse
的getEntity()
方法可获取HttpEntity
对象,该对象包装了服务器的响应内容。 - 释放连接:无论执行方法是否成功,都必须释放连接。
以上便是使用 HttpClient
的核心步骤:引入依赖、创建 HttpClient
对象、创建请求实例、设置请求参数、发送请求、获取请求结果、释放连接。
依赖
1 | <dependency> |
1 | // https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient |
HttpClient 工具类封装
1 | import org.apache.http.HttpStatus; |