HttpClient工具

import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
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.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.cookie.Cookie;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.http.MediaType;

import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Slf4j
public class HttpUtil {
    private final static RequestConfig REQUEST_CONFIG;
    public final static PoolingHttpClientConnectionManager CONNECTION_MANAGER;
    private final static HttpClientBuilder HTTP_CLIENT_NO_POOL_BUILDER;
    private final static HttpClientBuilder HTTP_CLIENT_POOL_BUILDER;
    private final static int CONNECT_TIMEOUT = 1000;
    private final static int SOCKET_TIMEOUT = 10000;
    private final static int REQUEST_TIMEOUT = 10000;
    private final static String COOKIE_HEADER_NAME = "Cookie";

    static {
        Registry<ConnectionSocketFactory> socketFactoryRegistry = null;
        SSLContext sslContext = null;
        try {
            sslContext = new SSLContextBuilder().loadTrustMaterial(null, (TrustStrategy) (chain, authType) -> true).build();
            socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.INSTANCE)
                .register("https", new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE))
                .build();
        } catch (Exception e) {
            log.info("信任ssl初始化异常:{}", ExceptionUtils.getStackTrace(e));
        }
        CONNECTION_MANAGER = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        CONNECTION_MANAGER.setMaxTotal(200);
        CONNECTION_MANAGER.setDefaultMaxPerRoute(100);
        CONNECTION_MANAGER.setValidateAfterInactivity(60000);

        REQUEST_CONFIG = RequestConfig.custom()
            .setConnectionRequestTimeout(REQUEST_TIMEOUT)
            .setConnectTimeout(CONNECT_TIMEOUT)
            .setSocketTimeout(SOCKET_TIMEOUT)
            .build();

        HTTP_CLIENT_NO_POOL_BUILDER = HttpClients.custom()
            .setDefaultRequestConfig(REQUEST_CONFIG)
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .setSSLContext(sslContext)
            .disableAutomaticRetries();

        HTTP_CLIENT_POOL_BUILDER = HttpClients.custom()
            .setDefaultRequestConfig(REQUEST_CONFIG)
            .setConnectionManager(CONNECTION_MANAGER)
            .disableAutomaticRetries();
    }

    public static HttpUtilResponse doPostJson(String url, Map<String, List<String>> urlParam, Object jsonBody, Map<String, String> headers, List<Cookie> cookies) {
        HttpPost httpPost = new HttpPost(setUrlParamToUrl(url, urlParam));
        CloseableHttpResponse response = null;
        setHeaders(httpPost, headers);
        setCookies(httpPost, cookies);
        long start = System.currentTimeMillis();
        try {
            String jsonParam = JSON.toJSONString(jsonBody);
            StringEntity stringEntity = new StringEntity(jsonParam);
            stringEntity.setContentType(MediaType.APPLICATION_JSON_VALUE);
            stringEntity.setContentEncoding(StandardCharsets.UTF_8.name());
            httpPost.setEntity(stringEntity);
            CloseableHttpClient httpClient = getTrustedHttpclient();
            response = httpClient.execute(httpPost);
            String result = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
            log.info("url:{},urlParam:{},jsonBody:{},headers:{},cookies:{},耗时;{},reslut:{}", url,
                JSON.toJSONString(urlParam), jsonParam, JSON.toJSONString(headers), JSON.toJSONString(cookies),
                System.currentTimeMillis() - start, result);
            return new HttpUtilResponse(httpRequestIsSuccess(response.getStatusLine()), result);
        } catch (Exception e) {
            log.error("url:{},异常:{}", url, ExceptionUtils.getStackTrace(e));
        } finally {
            if (response != null) {
                try {
                    EntityUtils.consume(response.getEntity());
                } catch (IOException e) {
                    log.error("HttpUtil还回连接池异常:{}", ExceptionUtils.getStackTrace(e));
                }
            }
        }
        return new HttpUtilResponse(false);
    }

    public static String getUrlParamStr(Map<String, List<String>> urlParam) {
        List<NameValuePair> pairs = getMapToPairs(urlParam);
        try {
            return EntityUtils.toString(new UrlEncodedFormEntity(pairs));
        } catch (IOException e) {
            log.error("将GET请求的Map参数转换为Url参数异常:{}", ExceptionUtils.getStackTrace(e));
        }
        return "";
    }

    private static String setUrlParamToUrl(String url, Map<String, List<String>> urlParam) {
        String urlParamStr = getUrlParamStr(urlParam);
        return url + (StringUtils.isBlank(urlParamStr) ? "" : ("?" + urlParamStr));
    }

    private static void setHeaders(HttpRequestBase http, Map<String, String> headers) {
        if (null == http) {
            return;
        }
        if (headers == null || headers.isEmpty()) {
            return;
        }
        Set<String> headerNames = headers.keySet();
        for (String headerName : headerNames) {
            http.setHeader(headerName, headers.get(headerName));
        }
    }

    private static void setCookies(HttpRequestBase http, List<Cookie> cookies) {
        if (null == http) {
            return;
        }
        if (cookies == null || cookies.isEmpty()) {
            return;
        }
        StringBuilder sb = new StringBuilder();
        for (Cookie cookie : cookies) {
            sb.append(cookie.getName());
            sb.append("=");
            sb.append(cookie.getValue());
            sb.append("; ");
        }
        http.setHeader(COOKIE_HEADER_NAME, sb.substring(0, sb.lastIndexOf(";")));
    }

    public static CloseableHttpClient getTrustedHttpclientNoPool() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        return HTTP_CLIENT_NO_POOL_BUILDER.build();
    }

    public static CloseableHttpClient getTrustedHttpclient() {
        return HTTP_CLIENT_POOL_BUILDER.build();
    }

    private static boolean httpRequestIsSuccess(StatusLine statusLine) {
        return statusLine != null && statusLine.getStatusCode() == HttpStatus.SC_OK;
    }

    private static List<NameValuePair> getMapToPairs(Map<String, List<String>> map) {
        if (map == null || map.size() == 0) {
            return new ArrayList<>(0);
        }
        List<NameValuePair> pairs = new ArrayList<>();
        Set<String> keys = map.keySet();
        for (String key : keys) {
            List<String> values = map.get(key);
            if (values == null || values.isEmpty()) {
                continue;
            }
            for (String value : values) {
                pairs.add(new BasicNameValuePair(key, value));
            }
        }
        return pairs;
    }

    static public class HttpUtilResponse {
        private Boolean success;
        private String result;

        public HttpUtilResponse(Boolean success) {
            this.success = success;
        }

        public HttpUtilResponse(Boolean success, String result) {
            this.success = success;
            this.result = result;
        }

        public Boolean getSuccess() {
            return success;
        }

        public String getResult() {
            return result;
        }

        public void setSuccess(Boolean success) {
            this.success = success;
        }

        public void setResult(String result) {
            this.result = result;
        }
    }
}
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HttpClient 是一个开源的 HTTP 客户端库,用于发送 HTTP 请求和处理响应。它是 Apache HttpComponents 项目的一部分,提供了简单且灵活的 API,用于进行 HTTP 通信。 你可以使用 HttpClient 来执行各种 HTTP 操作,如发送 GET、POST、PUT、DELETE 等请求。它支持处理响应、处理重定向、处理认证、处理代理等功能。 以下是使用 HttpClient 发送 GET 请求的示例代码: ```java import org.apache.http.HttpEntity; 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; public class HttpClientExample { public static void main(String[] args) { try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpGet httpGet = new HttpGet("http://example.com"); try (CloseableHttpResponse response = httpClient.execute(httpGet)) { HttpEntity entity = response.getEntity(); String responseString = EntityUtils.toString(entity); System.out.println(responseString); } } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码使用 HttpClient 发送了一个 GET 请求,并打印了响应内容。你可以根据需要修改代码以适应其他类型的请求和操作。 请注意,HttpClient 的最新版本是 HttpClient 5.x,但上述示例使用的是 HttpClient 4.x 的 API。你可以根据自己的需求选择使用哪个版本。 希望这个回答能对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值