章
目
录
HttpClient是进行HTTP请求的常用工具,熟练掌握它的使用方法,能够让我们更高效地与网络资源进行交互。本文将详细介绍HttpClient的各种使用方式,并给出工具类封装示例。
一、引入httpclient依赖
在使用HttpClient之前,首先要确保项目中引入了相应的依赖。若项目中尚未引入,需在pom.xml
文件中添加以下代码:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
添加这个依赖后,项目就具备了使用HttpClient的基础环境,后续便能调用相关的类和方法来发起HTTP请求。
二、发送GET请求
2.1 无参数GET请求
当我们需要发送不携带参数的GET请求时,可以参考以下代码:
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class HttpClientUtils {
public static String doGet() throws IOException {
// 创建默认的CloseableHttpClient实例,用于发送请求
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 创建HttpGet请求对象,指定请求的URL
HttpGet httpGet = new HttpGet("https://www.example.com/getDataList");
// 执行请求并获取响应
try (CloseableHttpResponse httpResponse = httpClient.execute(httpGet)) {
// 判断响应状态码是否为200(OK)
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 将响应实体转换为字符串并返回
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
这段代码中,先创建了CloseableHttpClient
实例,接着构建HttpGet
请求对象,发送请求后根据响应状态码判断请求是否成功,若成功则返回响应内容。
2.2 带参数GET请求
带参数的GET请求有两种常见实现方式:
- 直接在URL上拼接参数:直接在请求的URL后面拼接参数,示例如下:
HttpGet httpGet = new HttpGet("https://www.example.com/getDataList?pageIndex=1&pageSize=20");
这种方式简单直接,但当参数较多时,URL可能会变得冗长且不易维护。
- 使用URIBuilder添加参数:通过
URIBuilder
来添加参数,代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
public class HttpClientUtils {
public static String doGet() throws IOException, URISyntaxException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 创建URIBuilder对象,指定请求的URL
URIBuilder uriBuilder = new URIBuilder("https://www.example.com/getDataList");
// 添加参数
uriBuilder.addParameter("pageIndex", "1");
uriBuilder.addParameter("pageSize", "20");
// 根据构建好的URI创建HttpGet请求对象
HttpGet httpGet = new HttpGet(uriBuilder.build());
try (CloseableHttpResponse httpResponse = httpClient.execute(httpGet)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
使用URIBuilder
添加参数的方式更加灵活,参数管理也更方便,推荐在实际开发中使用。
三、发送POST请求
3.1 无参数POST请求
发送不携带参数的POST请求,代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class HttpClientUtils {
public static String doPost() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 创建HttpPost请求对象,指定请求的URL
HttpPost httpPost = new HttpPost("https://www.example.com/updateData");
try (CloseableHttpResponse httpResponse = httpClient.execute(httpPost)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
该代码与无参数GET请求的代码结构类似,只是将HttpGet
换成了HttpPost
,用于发送POST请求。
3.2 带参数(form表单方式)POST请求
以form表单方式发送带参数的POST请求,示例代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class HttpClientUtils {
public static String doPost() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost("https://www.example.com/updateData");
// 创建参数列表
List<NameValuePair> params = new ArrayList<>();
// 添加参数
params.add(new BasicNameValuePair("id", "1"));
params.add(new BasicNameValuePair("name", "新名字"));
// 创建UrlEncodedFormEntity对象,设置参数和字符编码
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);
// 将参数实体设置到HttpPost请求中
httpPost.setEntity(formEntity);
try (CloseableHttpResponse httpResponse = httpClient.execute(httpPost)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
这段代码构建了参数列表,并将其转换为UrlEncodedFormEntity
后设置到HttpPost
请求中,实现了以form表单方式发送带参数的POST请求。
3.3 带参数(json方式)POST请求
以JSON方式发送带参数的POST请求,代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class HttpClientUtils {
public static String doPost() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost = new HttpPost("https://www.example.com/updateData");
// 设置JSON格式的请求体
String jsonBody = "{\"id\":\"1\",\"name\":\"新名字\"}";
StringEntity stringEntity = new StringEntity(jsonBody);
// 设置请求体的内容类型和字符编码
stringEntity.setContentType("application/json;charset=utf-8");
// 将请求体设置到HttpPost请求中
httpPost.setEntity(stringEntity);
try (CloseableHttpResponse httpResponse = httpClient.execute(httpPost)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
此代码将JSON格式的字符串作为请求体,通过StringEntity
设置到HttpPost
请求中,并指定了请求体的内容类型,实现了以JSON方式发送带参数的POST请求。
四、发送PUT请求
4.1 无参数PUT请求
发送无参数的PUT请求,代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class HttpClientUtils {
public static String doPut() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 创建HttpPut请求对象,指定请求的URL
HttpPut httpPut = new HttpPut("https://www.example.com/updateData");
try (CloseableHttpResponse httpResponse = httpClient.execute(httpPut)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
该代码与无参数的GET、POST请求代码类似,只是使用了HttpPut
来发送PUT请求。
4.2 带参数(form表单方式)PUT请求
以form表单方式发送带参数的PUT请求,代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
public class HttpClientUtils {
public static String doPut() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPut httpPut = new HttpPut("https://www.example.com/updateData");
// 创建参数列表
List<NameValuePair> params = new ArrayList<>();
// 添加参数
params.add(new BasicNameValuePair("id", "1"));
params.add(new BasicNameValuePair("name", "新名字"));
// 创建UrlEncodedFormEntity对象,设置参数和字符编码
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);
// 将参数实体设置到HttpPut请求中
httpPut.setEntity(formEntity);
try (CloseableHttpResponse httpResponse = httpClient.execute(httpPut)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
这段代码与带参数(form表单方式)的POST请求类似,只是将HttpPost
替换为HttpPut
,用于发送PUT请求。
4.3 带参数(json方式)PUT请求
以JSON方式发送带参数的PUT请求,代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class HttpClientUtils {
public static String doPut() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPut httpPut = new HttpPut("https://www.example.com/updateData");
// 设置JSON格式的请求体
String jsonBody = "{\"id\":\"1\",\"name\":\"新名字\"}";
StringEntity stringEntity = new StringEntity(jsonBody);
// 设置请求体的内容类型和字符编码
stringEntity.setContentType("application/json;charset=utf-8");
// 将请求体设置到HttpPut请求中
httpPut.setEntity(stringEntity);
try (CloseableHttpResponse httpResponse = httpClient.execute(httpPut)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
该代码与以JSON方式发送带参数的POST请求类似,只是使用HttpPut
来发送PUT请求。
五、发送DELETE请求
5.1 无参数DELETE请求
发送无参数的DELETE请求,代码如下:
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class HttpClientUtils {
public static String doDelete() throws IOException {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 创建HttpDelete请求对象,指定请求的URL
HttpDelete httpDelete = new HttpDelete("https://www.example.com/updateData");
try (CloseableHttpResponse httpResponse = httpClient.execute(httpDelete)) {
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);
}
return null;
}
}
}
}
此代码使用HttpDelete
发送无参数的DELETE请求,并根据响应状态码处理响应结果。
六、添加请求头
在实际开发中,请求第三方接口时通常需要添加签名、时间戳等请求头。以POST请求为例,添加请求头的代码如下:
httpPost.setHeader("Content-Type", "application/json;charset=utf-8");
httpPost.setHeader("signature", "3045022100875efcef9eb54626bb0168a6baa7c61265d0001d49243f");
httpPost.setHeader("timestamp", String.valueOf(System.currentTimeMillis()));
GET、PUT、DELETE请求添加请求头的方式与POST请求相同,通过setHeader
方法设置相应的请求头信息即可。
七、超时时间设置
如果需要自定义HTTP请求的连接超时时间和数据传输超时时间,可以参考以下代码(以POST请求为例):
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(5000)
.setSocketTimeout(10000)
.build();
httpPost.setConfig(requestConfig);
在这段代码中,使用RequestConfig.custom()
创建配置对象,设置连接超时时间为5000毫秒,数据传输超时时间为10000毫秒,然后通过httpPost.setConfig(requestConfig)
将配置应用到HttpPost
请求中。GET、PUT、DELETE请求设置超时时间的方法与之相同。