简介
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 最新版本是 HttpClient 4.5.3 (GA)。官方下载:http://hc.apache.org/downloads.cgi
主要特性
基于标准、纯净的 Java 语言,实现了 HTTP1.0 和 HTTP1.1。
以可扩展的面向对象的结构实现了 HTTP 全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
支持加密的 HTTPS 协议(HTTP 通过 SSL 协议)。
通过 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 来保持持久连接。
可以直接获取服务器发送的响应码和响应头部。
具备设置连接超时的能力。
支持 HTTP/1.1 响应缓存。
源代码基于 Apache License 可免费获取。
一般使用步骤
使用 HttpClient 发送请求、接收响应,一般需要以下步骤。HttpGet 请求响应的一般步骤:1). 创建HttpClient
对象,可以使用HttpClients.createDefault()
;2). 如果是无参数的 GET 请求,则直接使用构造方法HttpGet(String url)
创建HttpGet
对象即可;如果是带参数 GET 请求,则可以先使用URIBuilder(String url)
创建对象,再调用addParameter(String param, String value)
,或setParameter(String param, String value)
来设置请求参数,并调用 build()方法构建一个 URI 对象。只有构造方法HttpGet(URI uri)
来创建 HttpGet 对象。3). 创建HttpResponse
,调用HttpClient
对象的execute(HttpUriRequest request)
发送请求,该方法返回一个HttpResponse
。调用HttpResponse
的getAllHeaders()、getHeaders(String name)
等方法可获取服务器的响应头;调用HttpResponse
的getEntity()
方法可获取 HttpEntity 对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()
可以获取响应状态码。4). 释放连接。
HttpPost 请求响应的一般步骤:1). 创建HttpClient
对象,可以使用HttpClients.createDefault()
;2). 如果是无参数的 GET 请求,则直接使用构造方法HttpPost(String url)
创建HttpPost
对象即可;如果是带参数 POST 请求,先构建 HttpEntity 对象并设置请求参数,然后调用 setEntity(HttpEntity entity)创建 HttpPost 对象。3). 创建HttpResponse
,调用HttpClient
对象的execute(HttpUriRequest request)
发送请求,该方法返回一个HttpResponse
。调用HttpResponse
的getAllHeaders()、getHeaders(String name)
等方法可获取服务器的响应头;调用HttpResponse
的getEntity()
方法可获取 HttpEntity 对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。通过调用getStatusLine().getStatusCode()
可以获取响应状态码。4). 释放连接。
实例代码实战
构建一个 Maven 项目,引入如下依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.10</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
复制代码
实例 1:普通的无参数 GET 请求
打开一个 url,抓取响应结果输出成 html 文件
/**
*普通的GET请求
*/
public class DoGET {
public static void main(String[] args) throws Exception {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建http GET请求
HttpGet httpGet = new HttpGet("http://www.baidu.com");
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
//请求体内容
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
//内容写入文件
FileUtils.writeStringToFile(new File("E:\\devtest\\baidu.html"), content, "UTF-8");
System.out.println("内容长度:"+content.length());
}
} finally {
if (response != null) {
response.close();
}
//相当于关闭浏览器
httpclient.close();
}
}
}
复制代码
实例 2:执行带参数的 GET 请求
模拟使用百度搜索关键字”java”,并保存搜索结果为 html 文件
/**
* 带参数的GET请求
* 两种方式:
* 1.直接将参数拼接到url后面 如:?wd=java
* 2.使用URI的方法设置参数 setParameter("wd", "java")
*/
public class DoGETParam {
public static void main(String[] args) throws Exception {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
// 定义请求的参数
URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
//response 对象
CloseableHttpResponse response = null;
try {
// 执行http get请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
//内容写入文件
FileUtils.writeStringToFile(new File("E:\\devtest\\baidu-param.html"), content, "UTF-8");
System.out.println("内容长度:"+content.length());
}
} finally {
if (response != null) {
response.close();
}
httpclient.close();
}
}
}
复制代码
实例 3:执行普通的 POST 请求
无参数的 POST 请求,并设置 Header 来伪装浏览器请求
/**
* 常规post请求
* 可以设置Header来伪装浏览器请求
*/
public class DoPOST {
public static void main(String[] args) throws Exception {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建http POST请求
HttpPost httpPost = new HttpPost("http://www.oschina.net/");
//伪装浏览器请求
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
CloseableHttpResponse response = null;
try {
// 执行请求
response = httpclient.execute(httpPost);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
//内容写入文件
FileUtils.writeStringToFile(new File("E:\\devtest\\oschina.html"), content, "UTF-8");
System.out.println("内容长度:"+content.length());
}
} finally {
if (response != null) {
response.close();
}
httpclient.close();
}
}
}
复制代码
实例 4:执行带参数的 POST 请求
模拟开源中国检索 java,并伪装浏览器请求,输出响应结果为 html 文件
/**
* 带参数的GET请求
* 两种方式:
* 1.直接将参数拼接到url后面 如:?wd=java
* 2.使用URI的方法设置参数 setParameter("wd", "java")
*/
public class DoGETParam {
public static void main(String[] args) throws Exception {
// 创建Httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
// 定义请求的参数
URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "java").build();
// 创建http GET请求
HttpGet httpGet = new HttpGet(uri);
//response 对象
CloseableHttpResponse response = null;
try {
// 执行http get请求
response = httpclient.execute(httpGet);
// 判断返回状态是否为200
if (response.getStatusLine().getStatusCode() == 200) {
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
//内容写入文件
FileUtils.writeStringToFile(new File("E:\\devtest\\baidu-param.html"), content, "UTF-8");
System.out.println("内容长度:"+content.length());
}
} finally {
if (response != null) {
response.close();
}
httpclient.close();
}
}
}
复制代码
总结
本文介绍了 HttpClient 的特性,是按照官方英文文档翻译而来,然后分别介绍了 HttpGet 和 HttpPost 的一般使用步骤,最后给出了 4 个简单的实例的 Java 代码。
评论