HttpClient使用方法总结及工具类封装

1. 引入httpclient依赖

首先,需要确认项目中是否已引入过httpclient依赖,如果没有引入过,需要在pom.xml中添加以下代码引入httpclient依赖:

<dependency>     <groupId>org.apache.httpcomponents</groupId>     <artifactId>httpclient</artifactId>     <version>4.5.13</version> </dependency> 

2. 发送GET请求

2.1 发送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 {         try (CloseableHttpClient httpClient = HttpClients.createDefault()) {             HttpGet httpGet = new HttpGet("https://www.example.com/getDataList");              try (CloseableHttpResponse httpResponse = httpClient.execute(httpGet)) {                 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {                     return EntityUtils.toString(httpResponse.getEntity(), StandardCharsets.UTF_8);                 }                  return null;             }         }     } } 

2.2 发送GET请求(带参数)

第一种方法是直接在url上拼接上参数,如下所示:

HttpGet httpGet = new HttpGet("https://www.example.com/getDataList?pageIndex=1&pageSize=20"); 

第二种方法是使用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 uriBuilder = new URIBuilder("https://www.example.com/getDataList");             uriBuilder.addParameter("pageIndex", "1");             uriBuilder.addParameter("pageSize", "20");              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;             }         }     } } 

3. 发送POST请求

3.1 发送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 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;             }         }     } } 

3.2 发送POST请求(带参数、form表单方式)

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 formEntity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);             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;             }         }     } } 

3.3 发送POST请求(带参数、json方式)

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");              String jsonBody = "{"id":"1","name":新名字}";             StringEntity stringEntity = new StringEntity(jsonBody);             stringEntity.setContentType("application/json;charset=utf-8");             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;             }         }     } } 

4. 发送PUT请求

4.1 发送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 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;             }         }     } } 

4.2 发送PUT请求(带参数、form表单方式)

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 formEntity = new UrlEncodedFormEntity(params, StandardCharsets.UTF_8);             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;             }         }     } } 

4.3 发送PUT请求(带参数、json方式)

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");              String jsonBody = "{"id":"1","name":新名字}";             StringEntity stringEntity = new StringEntity(jsonBody);             stringEntity.setContentType("application/json;charset=utf-8");             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;             }         }     } } 

5. 发送DELETE请求

5.1 发送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 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;             }         }     } } 

6. 添加请求头

一般情况下,请求第三方接口都需要签名、时间戳等请求头,以POST请求为例,添加请求头的代码如下所示:

httpPost.setHeader("Content-Type", "application/json;charset=utf-8"); httpPost.setHeader("signature", "3045022100875efcef9eb54626bb0168a6baa7c61265d0001d49243f"); httpPost.setHeader("timestamp", String.valueOf(System.currentTimeMillis())); 

GET请求、PUT请求、DELETE请求添加请求头的方法同上。

7. 超时时间设置

如果需要自定义HTTP请求的连接超时时间和数据传输超时时间,代码如下所示(以POST请求为例):

RequestConfig requestConfig = RequestConfig.custom()                     .setConnectTimeout(5000)                     .setSocketTimeout(10000)                     .build(); httpPost.setConfig(requestConfig); 

GET请求、PUT请求、DELETE请求设置超时时间的方法同上。

8.工具类封装

完整的工具类代码如下所示:

import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; 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.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Map;  public class HttpClientUtils {     /**      * 连接建立超时时间(单位:毫秒)      */     private static final int CONNECT_TIMEOUT = 5000;      /**      * 数据传输超时时间(单位:毫秒)      */     private static final int SOCKET_TIMEOUT = 10000;      /**      * 执行GET请求      *      * @param url     请求地址      * @param headers 请求头      * @return 响应内容字符串      */     public static String doGet(String url, Map<String, String> headers) throws IOException {         HttpGet httpGet = new HttpGet(url);          // 设置请求头         setHeaders(httpGet, headers);          return executeRequest(httpGet);     }      /**      * 执行GET请求      *      * @param url     请求地址      * @param headers 请求头      * @param params  请求参数      * @return 响应内容字符串      */     public static String doGet(String url, Map<String, String> headers, Map<String, String> params) throws IOException, URISyntaxException {         URIBuilder uriBuilder = new URIBuilder(url);          // 设置请求参数         if (params != null && !params.isEmpty()) {             for (Map.Entry<String, String> entry : params.entrySet()) {                 uriBuilder.setParameter(entry.getKey(), entry.getValue());             }         }          HttpGet httpGet = new HttpGet(uriBuilder.build());          // 设置请求头         setHeaders(httpGet, headers);          return executeRequest(httpGet);     }      /**      * 执行POST请求(表单方式)      *      * @param url 请求地址      * @return 响应内容字符串      */     public static String doPost(String url) throws IOException {         return doPost(url, null, null);     }      /**      * 执行POST请求(表单方式)      *      * @param url     请求地址      * @param headers 请求头      * @return 响应内容字符串      */     public static String doPost(String url, Map<String, String> headers) throws IOException {         return doPost(url, headers, null);     }      /**      * 执行POST请求(表单方式)      *      * @param url     请求地址      * @param headers 请求头      * @param params  请求参数      * @return 响应内容字符串      */     public static String doPost(String url, Map<String, String> headers, Map<String, String> params) throws IOException {         HttpPost httpPost = new HttpPost(url);          // 设置请求头         setHeaders(httpPost, headers);          // 构建表单参数         if (params != null) {             List<NameValuePair> paramList = new ArrayList<>();             for (Map.Entry<String, String> entry : params.entrySet()) {                 paramList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));             }             httpPost.setEntity(new UrlEncodedFormEntity(paramList, StandardCharsets.UTF_8));         }          return executeRequest(httpPost);     }      /**      * 执行POST请求(JSON格式)      *      * @param url     请求地址      * @param headers 请求头      * @return 响应内容字符串      */     public static String doPostJson(String url, Map<String, String> headers) throws IOException {         return doPostJson(url, headers, null);     }      /**      * 执行POST请求(JSON格式)      *      * @param url      请求地址      * @param headers  请求头      * @param jsonBody JSON请求体字符串      * @return 响应内容字符串      */     public static String doPostJson(String url, Map<String, String> headers, String jsonBody) throws IOException {         HttpPost httpPost = new HttpPost(url);          // 添加JSON请求头         addJsonHeader(httpPost, headers);         // 添加自定义请求头         setHeaders(httpPost, headers);          // 设置JSON请求体         if (jsonBody != null) {             StringEntity entity = new StringEntity(jsonBody,                     ContentType.APPLICATION_JSON.withCharset(StandardCharsets.UTF_8));             httpPost.setEntity(entity);         }          return executeRequest(httpPost);     }      /**      * 执行PUT请求(JSON格式)      *      * @param url      请求地址      * @param headers  请求头      * @param jsonBody JSON请求体字符串      * @return 响应内容字符串      */     public static String doPut(String url, Map<String, String> headers, String jsonBody) throws IOException {         HttpPut httpPut = new HttpPut(url);          // 添加JSON请求头         addJsonHeader(httpPut, headers);         // 添加自定义请求头         setHeaders(httpPut, headers);          // 设置JSON请求体         if (jsonBody != null) {             StringEntity entity = new StringEntity(jsonBody,                     ContentType.APPLICATION_JSON.withCharset(StandardCharsets.UTF_8));             httpPut.setEntity(entity);         }          return executeRequest(httpPut);     }      /**      * 执行DELETE请求      *      * @param url     请求地址      * @param headers 请求头      * @return 响应内容字符串      */     public static String doDelete(String url, Map<String, String> headers) throws IOException {         HttpDelete httpDelete = new HttpDelete(url);          // 设置请求头         setHeaders(httpDelete, headers);          return executeRequest(httpDelete);     }      /**      * 创建带超时配置的HttpClient      *      * @return HttpClient实例      */     private static CloseableHttpClient createHttpClient() {         RequestConfig requestConfig = RequestConfig.custom()                 .setConnectTimeout(CONNECT_TIMEOUT)                 .setSocketTimeout(SOCKET_TIMEOUT)                 .build();          return HttpClients.custom()                 .setDefaultRequestConfig(requestConfig)                 .build();     }      /**      * 添加JSON请求头      *      * @param httpRequest HTTP请求对象      * @param headers     请求头      */     private static void addJsonHeader(HttpRequestBase httpRequest, Map<String, String> headers) {         if (headers == null || !headers.containsKey("Content-Type")) {             httpRequest.addHeader("Content-Type", "application/json;charset=utf-8");         }     }      /**      * 设置请求头      *      * @param httpRequest HTTP请求对象      * @param headers     请求头      */     private static void setHeaders(HttpRequestBase httpRequest, Map<String, String> headers) {         if (headers == null || headers.isEmpty()) {             return;         }          for (Map.Entry<String, String> entry : headers.entrySet()) {             httpRequest.setHeader(entry.getKey(), entry.getValue());         }     }      /**      * 统一执行请求并处理响应      *      * @param httpRequest HTTP请求对象      * @return 响应内容字符串      */     private static String executeRequest(HttpRequestBase httpRequest) throws IOException {         try (CloseableHttpClient httpClient = createHttpClient()) {             try (CloseableHttpResponse response = httpClient.execute(httpRequest)) {                 return handleResponse(response);             }         }     }      /**      * 处理响应结果      *      * @param response HTTP响应对象      * @return 响应内容字符串      */     private static String handleResponse(CloseableHttpResponse response) throws IOException {         int statusCode = response.getStatusLine().getStatusCode();         if (statusCode != HttpStatus.SC_OK) {             throw new RuntimeException("HTTP请求失败,状态码:" + statusCode);         }          HttpEntity entity = response.getEntity();         if (entity != null) {             return EntityUtils.toString(entity, StandardCharsets.UTF_8);         }         return null;     } } 

发表评论

您必须 [ 登录 ] 才能发表留言!

相关文章