背景
最近发生了两件事,觉得有必要系统的学习一下Apache的HttpClient了。
事件一:联调微信支付接口,用到HttpClient,花时间整理了一番。如果有一篇文章,读一读就可以掌握HttpClient 80%的内容,再有可以直接用的Demo,下次再遇到是不是就可以非常容易集成了?这便是这篇文章的目标之一。
事件二:上家公司同事发消息求助,说系统JVM溢出,找不到原因不了。查看了发来的日志文件,基本定位是HttpClient调用三方接口时内存溢出导致的。
无论出于哪种原因,HTTP调用的熟练使用都是必不可少的,今天就来一起系统学习一下,查漏补缺。
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对象、创建请求实例、设置请求参数、发送请求、获取请求结果、释放连接。
文章刚开始提到的事件二