参考文献:http://hc.apache.org/
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/
http://hc.apache.org/httpcomponents-client-ga/examples.html
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
文章目录
1. HttpComponents
Apache HttpComponents项目旨在创建、维护一组低层次的用于Java的HTTP及其先关协议组件。
HttpComponents可用于:
- HTTP client应用;
- HTTP Server应用,例如web浏览器、web爬虫,HTTP代理,Web服务层库,或是基于HTTP的扩展协议。
HttpComponents 架构
HttpComponents 包括:HttpCore 、HttpClient 、Asynch HttpClient 、Commons HttpClient(被废弃的代码,不建议使用)
2. HttpClient简介
HTTPClient 是兼容HTTP/1.1的、基于HTTPCore的HTTP agent实现,支持认证、HTTP状态维护、HTTP连接管理。HTTPClient 是为了取代
Commons HttpClient 3.x而存在的,另外,强烈建议使用Commons HttpClient 的用户升级到HTTPClient。
虽然java.net包中提供了基础的HTTP方法,但是缺乏伸缩性、同时缺乏完善的功能。HttpClient用于填补这个空白。
2.1 特点
2.1.1 特点
- Httpclient基于HttpCore实现;
- 基于典型的阻塞IO;
- 不处理具体的Http Content(不对Http 内容进行解析,这应该由应用解析处理)
注意:
4. HttpClient并不是一个浏览器,HttpClient是一个Http client端的开发库。
5. HttpClient只是用于发送、接收Http信息,并不会帮你处理信息里面的内容。其实,它也不知道怎么处理。比如服务器给你回复了一个response,里面有个1,这是表示1块钱,还是1百万,这是具体的调用应用才直到解析的。而HttpClient是一个通用的库。它存在的目的是你不用去使用socket,去连接server,一点一点拼装消息体。另外,Httpclient还有复杂的功能,如池化连接等。
2.1.2 基本使用步骤
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。(需要导入httpclient-Versin.jar, httpcore-version.jar两个包。在使用过程中,有时候会抛出logging class not found 异常,这时可将commons-logging包导入工程即可)
-
创建HttpClient对象。
-
创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
-
如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
-
调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
-
调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
-
释放连接。无论执行方法是否成功,都必须释放连接
2.2 请求执行过程与相关对象
HttpClient的最基本使用方法是:创建请求对象,使用httpclient将该请求转交给Server,然后返回一个 response对象或是抛出异常。
上述过程使用代码就是:
CloseableHttpClient httpclient = HttpClients.createDefault();
//创建请求对象
HttpGet httpget = new HttpGet("http://localhost/");
//httpclient和server通信,将该请求转交给Server,并返回reposne
CloseableHttpResponse response = httpclient.execute(httpget);
try {
<...>
} finally {
response.close();
}
2.2.1 请求对象:HttpXXX(根据请求的方法进行分类,如HttpGet,HttpPost)
HttpClient支持 HTTP/1.1规范定义的所有方法:GET, HEAD, POST, PUT, DELETE, TRACE 和OPTIONS。不同的方法,在HttpClient中,使用不同的类进行封装,代表不同的请求方法,对应的是HttpGet,