一、项目中须要与一个基于HTTP协议的第三方的接口进行对接html
二、项目中须要动态的调用WebService服务(不生成本地源码)java
三、项目中须要利用其它网站的相关数据git
这些需求可能或多或少的会发生在平时的开发中,针对每种状况,可能解决方案不止一种。本文使用HttpClient这种工具来说解HttpClient的相关知识,以及如何使用HttpClient完成上述需求。github
有人说,HttpClient不就是一个浏览器嘛。。。apache
可能很多人对HttpClient会产生这种误解,他们的观点是这样的:既然HttpClient是一个HTTP客户端编程工具,那不就至关因而一个浏览器了吗?无非它不能把HTML渲染出页面而已罢了。编程
其实HttpClient不是浏览器,它是一个HTTP通讯库,所以它只提供一个通用浏览器应用程序所指望的功能子集,最根本的区别是HttpClient中没有用户界面,浏览器须要一个渲染引擎来显示页面,并解释用户输入网页爬虫
HTTP 协议多是如今 Internet 上使用得最多、最重要的协议了,愈来愈多的 Java 应用程序须要直接经过 HTTP 协议来访问网络资源。后端
虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,可是对于大部分应用程序来讲,JDK 库自己提供的功能还不够丰富和灵活。浏览器
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,而且它支持 HTTP 协议最新的版本和建议。服务器
1):提到HttpClient,就不得不提jdk原生的URL了。
jdk中自带了基本的网络编程,也就是java.net包下的一系列API。经过这些API,也能够完成网络编程和访问。
此外,另外一个开源项目jsoup,它是一个简单的HTML解析器,能够直接解析指定URL请求地址的内容,它能够经过DOM方式来取数据,也是比较方便的API。
这里实际上是有一个错误的认识:Jsoup是解析器不假,但它跟HttpClient不是同类产品(相似Hibernate和MyBatis),实际上平常使用一般会用HttpClient配合Jsoup作网页爬虫。
一、基于标准、纯净的java语言。实现了HTTP1.0和HTTP1.1;
二、以可扩展的面向对象的结构实现了HTTP所有的方法(GET, POST等7种方法);
三、支持HTTPS协议;
四、经过HTTP代理创建透明的链接;
五、利用CONNECT方法经过HTTP代理创建隧道的HTTPS链接;
六、Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案;
七、插件式的自定义认证方案;
八、便携可靠的套接字工厂使它更容易的使用第三方解决方案;
九、链接管理器支持多线程应用;支持设置最大链接数,同时支持设置每一个主机的最大链接数,发现并关闭过时的链接;
十、自动处理Set-Cookie中的Cookie;
十一、插件式的自定义Cookie策略;
十二、Request的输出流能够避免流中内容直接缓冲到socket服务器;
1三、Response的输入流能够有效的从socket服务器直接读取相应内容;
1四、在HTTP1.0和HTTP1.1中利用KeepAlive保持持久链接;
1五、直接获取服务器发送的response code和 headers;
1六、设置链接超时的能力;
1七、实验性的支持HTTP1.1 response caching;
1八、源代码基于Apache License 可免费获取。
在后端开发过程当中,后端服务不必定部署在一台服务器上,因此咱们须要一种技术能够实现后端调用其余后端的服务,这种调用被称为RPC(远程过程调用),以下图所示:
POM:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
流程:
一、建立HttpClient对象
这儿使用的是org.apache.http.impl.client.CloseableHttpClient,他是HttpClient接口的一个实例,建立该对象的最简单方法:CloseableHttpClient client = HttpClients.createDefault();
HttpClients是建立CloseableHttpClient的工厂,采用默认的配置来建立实例,通常状况下咱们就用这个默认的实例就足够,后面咱们能够去看下怎么定制本身需求配置的来建立HttpClient接口的实例。若是你去看这个函数的源代码,你能够看到
org.apache.http.client.CookieStore,org.apache.http.client.config.RequestConfig等等都是采用默认的。
二、建立某种请求方法的实例
建立某种请求的实例,并指定请求的url,若是是get请求,建立对象HttpGet,若是是post 请求,建立对象HttpPost。
类型的还有 HttpHead, HttpPost, HttpPut, HttpDelete, HttpTrace, 还有 HttpOptions。分别对应HEAD、POST PUT、DELETE、TRACE、OPTIONS方法,每一个方法是作什么的以下表:
能够看获得在Http协议中,只有post方法和put方法的请求里面有实体
三、若是有请求参数的话,Get方法直接写在url后面,例如
或者使用setParameter来设置参数:
使用 URIBuilder 对路径请求信息进行封装。
http://www.google.com/search?q=httpclient&btnG=Google+Search&aq=f&oq=
POST 请求也可使用 此方式进行携带参数。(携带参数有多种)
在介绍另外几种:
3):发送请求
调用CloseableHttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个CloseableHttpResponse对象。
CloseableHttpResponse response = client.execute(httpPost);
很明显CloseableHttpResponse就是用了处理返回数据的实体,经过它咱们能够拿到返回的状态码、首部、实体等等咱们须要的东西。
4):获取请求结果
调用CloseableHttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;
调用CloseableHttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可经过该对象获取服务器的响应内容
经过CloseableHttpEntity的getEntity取得实体以后,有两种处理结果的方法,
方法一:使用EntityUtils来处理。
该类是官方提供的一个处理实体的工具类,toSting方法将返回的实体转换为字符串,
可是官网不建议使用这个,除非响应实体从一个可信HTTP服务器发起和已知是有限长度的。
方法二:使用InputStream来读取
由于httpEntity.getContent方法返回的就是InputStream类型。
这种方法是官网推荐的方式,须要记得的是要本身释放底层资源。
关闭链接释放资源: