package com.hotent.sdk.utils; import cn.hutool.core.util.StrUtil; 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.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.utils.URIBuilder; 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.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; /** * @author liangjc * @company 广州宏天软件股份有限公司 * @email liangjc@jee-soft.cn * @date 2023-07-18 16:40 */ public class HttpClientUtils { // 编码格式。发送编码格式统一用UTF-8 private static final String ENCODING = "UTF-8"; // 设置连接超时时间,单位毫秒。 private static final int CONNECT_TIMEOUT = 6000; // 请求获取数据的超时时间(即响应时间),单位毫秒。 private static final int SOCKET_TIMEOUT = 6000; /*** * CONTENT_TYPE */ public final static String CONTENT_TYPE = "content-type"; /*** * Post Json请求头 */ public final static String CONTENT_TYPE_JSON = "application/json;charset=utf-8"; /** * 发送get请求;不带请求头和请求参数 * * @param url 请求地址 */ public static HttpClientResult doGet(String url) throws Exception { return doGet(url, null, null); } /** * 发送get请求;带请求参数 * * @param url 请求地址 * @param params 请求参数集合 */ public static HttpClientResult doGet(String url, Map params) throws Exception { return doGet(url, null, params); } /** * 发送get请求;带请求头和请求参数 * * @param url 请求地址 * @param headers 请求头集合 * @param params 请求参数集合 */ public static HttpClientResult doGet(String url, Map headers, Map params) throws Exception { // 创建httpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建访问的地址 URIBuilder uriBuilder = new URIBuilder(url); if (params != null) { Set> entrySet = params.entrySet(); for (Map.Entry entry : entrySet) { uriBuilder.setParameter(entry.getKey(), entry.getValue()); } } // 创建http对象 HttpGet httpGet = new HttpGet(uriBuilder.build()); /** * setConnectTimeout:设置连接超时时间,单位毫秒。 * setConnectionRequestTimeout:设置从connect Manager(连接池)获取Connection * 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。 * setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。 */ RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build(); httpGet.setConfig(requestConfig); // 设置请求头 packageHeader(headers, httpGet); try { // 执行请求并获得响应结果 return getHttpClientResult(httpClient, httpGet); } finally { // 释放资源 close(httpClient); } } /** * 发送post请求;不带请求头和请求参数 * * @param url 请求地址 */ public static HttpClientResult doPost(String url) throws Exception { return doPost(url, null, null); } /** * 发送post请求;带请求参数 * * @param url 请求地址 * @param paramStr 请求json参数 */ public static HttpClientResult doPost(String url, String paramStr) throws Exception { return doPost(url, null, paramStr); } /** * 发送post请求;带请求头和请求参数 * * @param url 请求地址 * @param headers 请求头集合 * @param paramStr 请求json参数 */ public static HttpClientResult doPost(String url, Map headers, String paramStr) throws Exception { // 创建httpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建http对象 HttpPost httpPost = new HttpPost(url); /** * setConnectTimeout:设置连接超时时间,单位毫秒。 * setConnectionRequestTimeout:设置从connect Manager(连接池)获取Connection * 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。 * setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。 */ RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build(); httpPost.setConfig(requestConfig); if (!headers.containsKey(CONTENT_TYPE)) { headers.put(CONTENT_TYPE, CONTENT_TYPE_JSON); } packageHeader(headers, httpPost); // 封装请求参数 packageParam(null, paramStr, httpPost); try { // 执行请求并获得响应结果 return getHttpClientResult(httpClient, httpPost); } finally { // 释放资源 close(httpClient); } } /** * 封装请求头 */ public static void packageHeader(Map params, HttpRequestBase httpMethod) { // 封装请求头 if (params != null) { Set> entrySet = params.entrySet(); for (Map.Entry entry : entrySet) { // 设置到请求头到HttpRequestBase对象中 httpMethod.setHeader(entry.getKey(), entry.getValue()); } } } /** * 封装请求参数 */ public static void packageParam(Map params, String paramStr, HttpEntityEnclosingRequestBase httpMethod) throws UnsupportedEncodingException { // 封装请求参数 if (params != null) { List nvps = new ArrayList<>(); Set> entrySet = params.entrySet(); for (Map.Entry entry : entrySet) { nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } // 设置到请求的http对象中 httpMethod.setEntity(new UrlEncodedFormEntity(nvps, ENCODING)); } if (StrUtil.isNotEmpty(paramStr)) { httpMethod.setEntity(new StringEntity(paramStr, ENCODING)); } } /** * 获得响应结果 */ public static HttpClientResult getHttpClientResult(CloseableHttpClient httpClient, HttpRequestBase httpMethod) throws IOException { try (CloseableHttpResponse httpResponse = httpClient.execute(httpMethod)) { // 获取返回结果 if (httpResponse != null && httpResponse.getStatusLine() != null) { String content = ""; if (httpResponse.getEntity() != null) { content = EntityUtils.toString(httpResponse.getEntity(), ENCODING); } return new HttpClientResult(httpResponse.getStatusLine().getStatusCode(), content); } } return new HttpClientResult(HttpStatus.SC_INTERNAL_SERVER_ERROR, null); } /** * 释放资源 */ public static void close(CloseableHttpClient httpClient) throws IOException { if (httpClient != null) { httpClient.close(); } } }