小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
1. HTTPClient
1.1 介绍
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。
1.2 特性
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 可免费获取。
1.3 引入依赖
在开发Java项目时,使用HttpClient要引入相关的依赖信息:
<!-- httpclient 依赖 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
1.4 使用流程
HttpClient进行HTTP请求的一般流程为:
- 创建HttpClent对象,
- 根据请求URL和请求类型创建HttpGet或HttpPost对象,
- 如果需要请求参数,则在对象中添加参数信息,
- 调用HttpClient的execute方法发送HTTP请求,并使用HttPResponse对象接收返回结果,
- 对返回结果HttpResponse处理,得到需要的数据。
2 GET请求
2.1 具体步骤
- 创建
HttpClient对象:使用HttpClients.createDefault() - 创建
HttpGet对象:- 如果是无参数的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对象。
- 如果是无参数的GET请求,则直接使用构造方法
- 创建
HttpResponse对象:通过该对象获取服务器的响应内容- 调用
HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。 - 调用
HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头; - 调用
HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。 - 通过调用
HttpResponse的getStatusLine()/getStatusCode()方法可以获取响应状态码。
- 调用
- 释放连接。
2.2 无参数GET请求
HttpClient的HttpGet请求默认是无参数的,只需要按照标准流程创建并完成请求即可。
//1.获得一个httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//2.生成一个get请求
HttpGet httpget = new HttpGet("http://www.baidu.com/");
//3.执行get请求并返回结果
CloseableHttpResponse response = httpclient.execute(httpget);
try {
//4.处理结果响应体
HttpEntity entity = response.getEntity();
} finally {
response.close();
}
2.3 有参数GET请求
当GET请求需要传递参数时,即最终参数以key=value的形式拼接在url之后,HttpClient中需要先将参数生成URI对象,然后使用生成的URI创建HttpGet对象。
//1.获得一个httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//2.生成一个带参数的uri对象
URI uri = new URIBuilder(String url)
.addParameter("key", "value")
.buiild();
//3.创建get请求对象
HttpGet httpget = new HttpGet(uri);
//4.执行get请求并返回结果
CloseableHttpResponse response = httpclient.execute(httpget);
try {
//5.处理结果响应体
HttpEntity entity = response.getEntity();
} finally {
response.close();
}
3. POST请求
3.1 具体步骤
- 创建
HttpClient对象:使用HttpClients.createDefault(); - 创建
HttpPost对象:- 如果是无参数的GET请求,则直接使用构造方法
HttpPost(String url)创建HttpPost对象即可; - 如果是带参数POST请求,先构建HttpEntity对象并设置请求参数,然后调用setEntity(HttpEntity entity)创建HttpPost对象。
- 如果是无参数的GET请求,则直接使用构造方法
- 创建
HttpResponse对象:程序可通过该对象获取服务器的响应内容- 调用
HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。 - 调用
HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头; - 调用
HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。 - 通过调用
getStatusLine().getStatusCode()可以获取响应状态码。
- 调用
- 释放连接。
3.2 无参数POST请求
无参数的POST请求可以直接对创建的post请求执行即可
//1.获得一个httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//2.生成一个post请求
HttpPost httpPost = new HttpPost("http://www.baidu.com/");
//3.执行get请求并返回结果
CloseableHttpResponse response = httpclient.execute(httpPost);
try {
//4.处理结果响应体
HttpEntity entity = response.getEntity();
} finally {
response.close();
}
3.3 有参数POST请求
post请求传递参数的形式是将参数放入请求体中,类似表单提交的形式将所有参数放入一个表单对象,然后将表单对象放入请求体中传递。
//1.获得一个httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//2.生成一个post请求
HttpPost httpPost = new HttpPost("http://www.baidu.com/");
//3.请求参数添加到请求体中,表单提交
List<NameValuePair> nvpList = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair(key, val));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nvps, charset);
httpPost.setEntity(formEntity);
//4.执行get请求并返回结果
CloseableHttpResponse response = httpclient.execute(httpPost);
try {
//5.处理结果响应体
HttpEntity entity = response.getEntity();
} finally {
response.close();
}