HttpClient简介
HTTPClient是Apache Jakarta Common下的子项目, 用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。
HttpClient相比传统的JDK自带的URLConnection,增加了易用性和灵活性,它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于HTTP协议),既提高了开发效率,也提高代码的健壮性。
HttpClient是对JDK的URLConnection
的封装。
特点
- 基于标准Java语言,实现了HTTP1.0和HTTP1.1
- 以可扩展的面向对象的结构实现了HTTP全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE)
- 支持HTTPS协议,支持SSL连接
- 通过HTTP代理建立透明连接
- 利用CONNECT方法通过HTTP代理建立隧道的HTTPS连接,即HTTPS代理
- 支持Basic,Digest认证方案
- 插件式自定义认证方案,如OAuth2
- 便携可靠的套接字工厂,更容易使用第三方解决方案,支持socket
- 连接管理器支持多线程,支持设置最大连接数,设置每个主机的最大连接数,自动关闭过期连接,支持并发请求
- 自动处理Set-Cookie中的Cookie
- 插件式自定义Cookie策略
- Request的输出流可以避免流中内容直接缓冲到Socket服务器
- Response的输入流可以有效的从Socket服务器直接读取相应的内容
- 在HTTP1.0和HTTP1.1中用KeepAlive保持持久连接
- 直接获取服务器发送的response code和headers
- 设置连接超时
- 实验性支持HTTP1.1 response caching
- 源码可获取
使用流程
可以模拟一个真实的浏览器
步骤:
- 创建
HttpClient
对象。 - 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建
HttpGet
对象,如果需要发送POST请求,创建HttpPost
对象。 - 如果需要发送请求参数,可调用
HttpGet
、HttpPost
都有的setParams(HttpParams params)
方法来添加请求参数;对于HttpPost
对象,也可以调用setEntity(HTTPEntity entity)
方法来设置请求参数。 - 调用
HttpClient
的execute(HttpUriRequest request)
发送请求,该方法返回一个HttpResponse
。 - 调用
HttpResponse
对象的getAllHeaders()
、getHeaders(String name)
等方法可获取服务器的响应头。 - 调用
HttpResponse
对象的getEntity()
方法可获取HttpEntity
对象,该对象包装了服务器的响应内容,程序可通过该对象获取服务器的响应内容。 - 释放连接。无论执行方法释放成功,都必须释放连接。
实例
GET
private static void get() {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://localhost:8080/user/page?draw=1&start=0&length=10");
httpGet.setHeader("Cookie", "Idea-ac55e8ee=da800ceb-e5cc-48a9-b50c-9a390a71dabb; JSESSIONID=FF86C260DADB7127FDF5CC205EB91A76");
httpGet.setHeader("Connection", "keep-alive");
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0");
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity entity = httpResponse.getEntity();
System.out.println(EntityUtils.toString(entity));
} catch (IOException e) {
e.printStackTrace();
}
}
POST
private static void post() {
HttpPost httpPost = new HttpPost("http://localhost:8080/user/page");
httpPost.setHeader("Cookie", "Idea-ac55e8ee=da800ceb-e5cc-48a9-b50c-9a390a71dabb; JSESSIONID=06DB6014716A8F1F0A1D71CDF2BBC5E1");
httpPost.setHeader("Connection", "keep-alive");
httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0");
List<BasicNameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("draw", "0"));
params.add(new BasicNameValuePair("start", "0"));
params.add(new BasicNameValuePair("length", "10"));
try {
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity entity = httpResponse.getEntity();
System.out.println(EntityUtils.toString(entity));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}