Apache HttpClient 简介
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。
HttpClient 相比传统 JDK 自带的 URLConnection,增加了易用性和灵活性,它不仅是客户端发送 HTTP 请求变得容易,而且也方便了开发人员测试接口(基于 HTTP 协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握 HttpClient 是很重要的必修内容,掌握 HttpClient 后,相信对于 HTTP 协议的了解会更加深入。
Apache HttpClient 官网: http://hc.apache.org/httpcomponents-client-4.5.x/index.html
HttpClient Tutorial: http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/index.html
Apache HttpClient 特性
- 基于标准、纯净的 Java 语言。实现了 HTTP 1.0 和 HTTP 1.1
- 以可扩展的面向对象的结构实现了 HTTP 全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and 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 和 HTTP 1.1 中利用 KeepAlive 保持持久连接。
- 直接获取服务器发送的 response code 和 headers。
- 设置连接超时的能力。
- 实验性的支持 HTTP 1.1 response caching。
- 源代码基于 Apache License 可免费获取。
Apache HttpClient 主要依赖
当我们使用 HttpClient 调用第三方接口的时候,主要用的就是下面三个依赖:
org.apache.httpcomponents:httpclient
:核心包。org.apache.httpcomponents:fluent-hc
:是 Apache HttpClient 官方下的一个子项目,提供链式调用风格的 API,支持常用的 HTTP Method,支持 proxy,支持添加 Header,支持异步 API,如果想做其他个性化配置,也预留了 API,让用户使用自己配置的 HttpClient。详情可参考 Fluent API。org.apache.httpcomponents:httpmime
:HttpClient 通过 POST 来上传文件,而不是通过流的形式,并在服务端进行解析,其就是通过 httpmime 来操作的。
Apache HttpClient 使用流程
使用 HttpClient 发送请求、接收响应很简单,一般需要如下几步即可。
- 创建
HttpClient
对象。 - 创建请求方法的实例,并指定请求 URL。如果需要发送 GET 请求,创建
HttpGet
对象;如果需要发送 POST 请求,创建HttpPost
对象。 - 如果需要发送请求参数,可调用
HttpGet
、HttpPost
共同的setParams(HttpParams params)
方法来添加请求参数;对于HttpPost
对象而言,也可调用setEntity(HttpEntity entity)
方法来设置请求参数。 - 调用
HttpClient
对象的execute(HttpUriRequest request)
发送请求,该方法返回一个HttpResponse
。 - 调用
HttpResponse
的getAllHeaders()
、getHeaders(String name)
等方法可获取服务器的响应头;调用HttpResponse
的getEntity()
方法可获取HttpEntity
对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。 - 释放连接。无论执行方法是否成功,都必须释放连接
Apache HttpClient 使用实例
POM
pom.xml 配置如下:
1 | <!-- Apache Http Begin --> |
官网案例
官网案例:http://hc.apache.org/httpcomponents-client-4.5.x/quickstart.html
1 |
|
流式编程案例
案例代码如下:
1 |
|
创建 HttpGet 请求
案例代码如下:
1 | /** |
创建 HttpPost 请求
案例代码如下:
1 | /** |
控制台输出结果:
1 | { |
参考:https://www.twilio.com/blog/5-ways-to-make-http-requests-in-java
案例源码:https://github.com/V-Vincen/calling-third-party-api
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !