一、HttpClient简介
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
参考资料:http://www.yeetrack.com/?p=779
二、HttpClient特性
- 基于标准、纯净的java语言。实现了Http1.0和Http1.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服务器直接读取相应内容。
- 在http1.0和http1.1中利用KeepAlive保持持久连接。
- 直接获取服务器发送的response code和 headers。
- 设置连接超时的能力。
- 实验性的支持http1.1 response caching。
- 源代码基于Apache License 可免费获取。
三、HttpClient入门使用
3.1 在pom.xml中导入jar
<!-- 引入httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
3.2 使用方法
使用HttpClient需要如下6个步骤:
1、创建HttpClient的实例
2、创建某种连接方法的实例,如果发送GET请求,创建HttpGet对象,如果发送POST请求,创建HttpPost对象
3、发送请求参数,GET请求,可以通过URIBuilder来构建HttpGet的访问URI,POST请求,可以通过setEntity(HttpEntity entity)方法设置请求参数
4、调用HttpClient的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse
5、调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头信息,调用HttpResponse的getEntity对象,可以获取服务器的响应体信息
6、无论执行方法是否成功,都必须释放连接
方法 | 描述 | 是否包含主体 |
GET | 从服务器获取一份文档 | 否 |
HEAD | 只从服务器获取文档的首部 | 否 |
POST | 向服务器发送需要处理的数据 | 是 |
PUT | 将请求的主体部分存储在服务器上 | 是 |
TRACE | 对可能经过代理服务器传送到服务器上去的报文进行追踪 | 否 |
OPTIONS | 决定可以在服务器上执行哪些方法 | 否 |
DELETE | 从服务器上删除一份文档 | 否 |
可以看得到在Http协议中,只有post方法和put方法的请求里面有实体
3.3 入门示例
Get请求
@Test
public void demo2() {
// 1、创建httpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
String url = "http://api.map.baidu.com/geodata/v3/geotable/list";
Map<String,String> params = new HashMap<String, String>();
params.put("ak","xxxxx");
CloseableHttpResponse httpResponse = null;
try {
// 封装URI
URIBuilder uriBuilder = new URIBuilder(url);
if (params != null){
for (String key : params.keySet()){
uriBuilder.addParameter(key,params.get(key));
}
}
URI uri = uriBuilder.build();
// 2、请求对象
//HttpGet httpGet = new HttpGet("http://api.map.baidu.com/geodata/v3/geotable/list?ak=xxxxxx");
HttpGet httpGet = new HttpGet(uri);
// 3、发送请求
httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200){
// 4、打印响应结果
HttpEntity httpEntity = httpResponse.getEntity();
System.out.println(EntityUtils.toString(httpEntity,"UTF-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (httpResponse != null){
httpResponse.close();
}
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Post请求
@Test
public void demo1() throws IOException {
// 1、创建httpClient对象
CloseableHttpClient httpClient = HttpClients.createDefault();
// 2、请求对象
HttpPost httpPost = new HttpPost("http://api.map.baidu.com/geodata/v3/geotable/create");
// 构建请求配置信息
RequestConfig config = RequestConfig.custom().setConnectTimeout(1000) // 创建连接的最长时间
.setConnectionRequestTimeout(500) // 从连接池中获取到连接的最长时间
.setSocketTimeout(10 * 1000) // 数据传输的最长时间
.build();
httpPost.setConfig(config);
// 3、绑定参数
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("name","myTableTest1"));
nameValuePairs.add(new BasicNameValuePair("geotype","1"));
nameValuePairs.add(new BasicNameValuePair("is_published","1"));
nameValuePairs.add(new BasicNameValuePair("ak","zbLsuDDL4CS2U0M4KezOZZbGUY9iWtVf"));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, Charsets.UTF_8));
// 4、发送请求
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
// 5、打印响应结果
HttpEntity httpEntity = httpResponse.getEntity();
System.out.println(EntityUtils.toString(httpEntity));
}