使用HTTPClient工具实现HTTP请求

769 阅读5分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

1. HTTPClient

1.1 介绍

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。

官网地址

1.2 特性

httpclient有以下特性:

  1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1
  2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
  3. 支持HTTPS协议。
  4. 通过Http代理建立透明的连接。
  5. 利用CONNECT方法通过Http代理建立隧道的https连接。
  6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。
  7. 插件式的自定义认证方案。
  8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。
  9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
  10. 自动处理Set-Cookie中的Cookie。
  11. 插件式的自定义Cookie策略。
  12. Request的输出流可以避免流中内容直接缓冲到socket服务器。
  13. Response的输入流可以有效的从socket服务器直接读取相应内容。
  14. 在http1.0和http1.1中利用KeepAlive保持持久连接。
  15. 直接获取服务器发送的response code和 headers。
  16. 设置连接超时的能力。
  17. 实验性的支持http1.1 response caching。
  18. 源代码基于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请求的一般流程为:

  1. 创建HttpClent对象,
  2. 根据请求URL和请求类型创建HttpGet或HttpPost对象,
  3. 如果需要请求参数,则在对象中添加参数信息,
  4. 调用HttpClient的execute方法发送HTTP请求,并使用HttPResponse对象接收返回结果,
  5. 对返回结果HttpResponse处理,得到需要的数据。

2 GET请求

2.1 具体步骤

  1. 创建HttpClient对象:使用HttpClients.createDefault()
  2. 创建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对象。
  3. 创建HttpResponse对象:通过该对象获取服务器的响应内容
    • 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse
    • 调用HttpResponsegetAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;
    • 调用HttpResponsegetEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容
    • 通过调用HttpResponsegetStatusLine()/getStatusCode()方法可以获取响应状态码。
  4. 释放连接。

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 具体步骤

  1. 创建HttpClient对象:使用HttpClients.createDefault()
  2. 创建HttpPost对象:
    • 如果是无参数的GET请求,则直接使用构造方法HttpPost(String url)创建HttpPost对象即可;
    • 如果是带参数POST请求,先构建HttpEntity对象并设置请求参数,然后调用setEntity(HttpEntity entity)创建HttpPost对象。
  3. 创建HttpResponse对象:程序可通过该对象获取服务器的响应内容
    • 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse
    • 调用HttpResponsegetAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;
    • 调用HttpResponsegetEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容
    • 通过调用getStatusLine().getStatusCode()可以获取响应状态码。
  4. 释放连接。

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();
}