• 00037-java 的http请求工具类,HttpClientUtils


    
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import org.apache.commons.collections.MapUtils;
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.http.Header;
    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.HttpEntityEnclosingRequestBase;
    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.HttpClientConnectionManager;
    import org.apache.http.conn.socket.ConnectionSocketFactory;
    import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLContexts;
    import org.apache.http.conn.ssl.X509HostnameVerifier;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.springframework.util.CollectionUtils;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.SocketTimeoutException;
    import java.net.URLEncoder;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * 
     */
    public class HttpClientUtils {
        private static Log logger = LogFactory.getLog(HttpClientUtils.class);
    
        private static PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();
        private static CloseableHttpClient httpClient = null;
        private static final int DEFAULT_MAX_TOTAL_CONNECTION = 1024;
        private static final int DEFAULT_MAX_PER_ROUTE = 300;
        private static final String DEFAULT_ENCODING = "UTF-8"; // 默认的查询参数及返回结果的字符串编码
        private static final String CONTENT_TYPE_TEXT_XML = "application/xml"; // 默认的查询参数及返回结果的字符串编码
        private static final String APPLICATION_XML = "text/xml"; // 默认的查询参数及返回结果的字符串编码
        private static final int DEFAULT_CONNECTION_TIME_OUT = 60000; // 默认连接超时时间,
        // 60秒
        private static final int DEFAULT_READ_TIME_OUT = 200000; // 默认响应超时时间, 60秒
    
        public static JSONObject custRespHeader = new JSONObject();
    
        static {
            poolingHttpClientConnectionManager.setMaxTotal(DEFAULT_MAX_TOTAL_CONNECTION);
            poolingHttpClientConnectionManager.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);
            httpClient = HttpClients.custom().setConnectionManager(poolingHttpClientConnectionManager).build();
        }
    
        private HttpClientUtils() {
        }
    
        /**
         * @param url
         * @param params
         * @param encode
         * @param connectTimeout
         * @param readTimeout
         * @return
         */
        public static String invokeGet(String url, Map<String, String> params, String encode, int connectTimeout,
                                       int readTimeout) {
            if (connectTimeout <= 0) {
                return null;
            }
            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(readTimeout)
                    .setConnectTimeout(connectTimeout).setConnectionRequestTimeout(connectTimeout).build();
            String responseString;
            String requestUrl;
            try {
                requestUrl = buildRequestUrl(url, params);
            } catch (UnsupportedEncodingException e) {
                logger.error("encode http get params error, params is " + params, e);
                return "";
            }
            HttpPost httpGet = new HttpPost(requestUrl);
            httpGet.setHeader("Connection", "close");
            httpGet.setConfig(requestConfig);
            responseString = doRequest(httpGet, encode);
            return responseString;
        }
    
        /**
         * @param requestUrl
         * @param params
         * @return
         */
        public static String invokePost(String requestUrl, Map<String, Object> params) {
            return invokePost(requestUrl, params, null, null, DEFAULT_ENCODING, DEFAULT_CONNECTION_TIME_OUT,
                    DEFAULT_READ_TIME_OUT);
        }
        public static String invokePost(String requestUrl, Map<String, Object> params,Map<String, String> requestHeader) {
            return invokePost(requestUrl, params, requestHeader, null, DEFAULT_ENCODING, DEFAULT_CONNECTION_TIME_OUT,
                    DEFAULT_READ_TIME_OUT);
        }
    
        /**
         * @param requestUrl
         * @param requestHeader
         * @param requestBody
         * @return
         */
        public static String invokePost(String requestUrl, Map<String, String> requestHeader, String requestBody) {
            return invokePost(requestUrl, null, requestHeader, requestBody, DEFAULT_ENCODING, DEFAULT_CONNECTION_TIME_OUT,
                    DEFAULT_READ_TIME_OUT);
        }
    
    
        /**
         * @param requestUrl
         * @param params
         * @param requestHeader
         * @param requestBody
         * @param encode
         * @param connectTimeout
         * @param readTimeout
         * @return
         */
        public static String invokePost(String requestUrl, Map<String, Object> params, Map<String, String> requestHeader,
                                        String requestBody, String encode, int connectTimeout, int readTimeout) {
            RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(readTimeout)
                    .setConnectTimeout(connectTimeout).setConnectionRequestTimeout(connectTimeout).build();
            String responseString;
            HttpPost httpPost = new HttpPost(requestUrl);
            httpPost.setConfig(requestConfig);
    
            if (MapUtils.isNotEmpty(requestHeader)) {
                for (Map.Entry<String, String> entry : requestHeader.entrySet()) {
                    httpPost.addHeader(entry.getKey(), entry.getValue());
                }
            }
    
            buildPostParams(httpPost, params, requestBody, encode);
            responseString = doRequest(httpPost, encode);
            return responseString;
        }
    
        /**
         * @param httpPost
         * @param params
         * @param requestBody
         * @param encode
         */
        private static void buildPostParams(HttpPost httpPost, Map<String, Object> params, String requestBody,
                                            String encode) {
            try {
                if (MapUtils.isNotEmpty(params)) {
                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    
                    for (Map.Entry<String, Object> entry : params.entrySet()) {
                        String value = null;
                        if (entry.getValue() instanceof String) {
                            value = (String) entry.getValue();
                        } else {
                            value = JSON.toJSONString(entry.getValue());
                        }
                        nameValuePairs.add(new BasicNameValuePair(entry.getKey(), value));
                    }
    
                    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, encode));
                }
    
                if (StringUtils.isNotBlank(requestBody)) {
                    httpPost.setEntity(new StringEntity(requestBody, encode));
                }
    
            } catch (UnsupportedEncodingException e) {
                logger.error("HttpClientUtils.buildPostParams error, params = " + params, e);
            }
        }
    
        /**
         * @param httpRequestBase
         * @param encode
         * @return
         */
        private static String doRequest(HttpRequestBase httpRequestBase, String encode) {
            String responseString = null;
            try {
                long start = System.currentTimeMillis();
                CloseableHttpResponse response = httpClient.execute(httpRequestBase);
                logger.info("HttpClientUtils Begin Invoke: " + httpRequestBase.getURI() + ", cost time "
                        + (System.currentTimeMillis() - start) + " ms");
                try {
                    Header[] headers = response.getHeaders("isLogin");
                    if(headers!=null && headers.length>0){
                        custRespHeader.put(headers[0].getName(),headers[0].getValue());
                    }
                    HttpEntity entity = response.getEntity();
                    try {
                        if (entity != null) {
                            responseString = EntityUtils.toString(entity, encode);
                        }
                    } finally {
                        if (entity != null) {
                            entity.getContent().close();
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.error(String.format("[HttpClientUtils.doRequest] get response error, url:%s",
                            httpRequestBase.getURI()), e);
                    responseString = "";
                } finally {
                    if (response != null) {
                        response.close();
                    }
                }
            } catch (SocketTimeoutException e) {
                e.printStackTrace();
                logger.error(String.format("[HttpClientUtils.doRequest] invoke get timout error, url:%s",
                        httpRequestBase.getURI()), e);
                responseString = "";
            } catch (Exception e) {
                e.printStackTrace();
                logger.error(
                        String.format("[HttpClientUtils.doRequest] invoke get error, url:%s", httpRequestBase.getURI()), e);
                responseString = "";
            } finally {
                httpRequestBase.releaseConnection();
            }
            logger.info("HttpClientUtils response : " + responseString);
    
            return responseString;
        }
    
        /**
         * @param url
         * @param params
         * @return
         * @throws UnsupportedEncodingException
         */
        private static String buildRequestUrl(String url, Map<String, String> params) throws UnsupportedEncodingException {
            if (CollectionUtils.isEmpty(params)) {
                return url;
            }
            StringBuilder requestUrl = new StringBuilder();
            requestUrl.append(url);
            int i = 0;
            for (Map.Entry<String, String> entry : params.entrySet()) {
                if (i == 0) {
                    requestUrl.append("?");
                }
                requestUrl.append(entry.getKey());
                requestUrl.append("=");
                String value = entry.getValue();
                requestUrl.append(URLEncoder.encode(value, "UTF-8"));
                requestUrl.append("&");
                i++;
            }
            requestUrl.deleteCharAt(requestUrl.length() - 1);
            return requestUrl.toString();
        }
    
    
        public static void setStringParams(HttpPost httpost,
                                           Map<String, String> params) {
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
            Set<String> keySet = params.keySet();
            for (String key : keySet) {
                nvps.add(new BasicNameValuePair(key, params.get(key).toString()));
            }
            try {
                httpost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
            }
        }
    
    
        /**
         * @param httpRequest
         * @param entity
         * @param
         * @return
         */
        private static String sendRequest(HttpRequestBase httpRequest, HttpEntity entity) {
    
            httpRequest.setHeader("User-Agent", "okHttp");
            if (httpRequest instanceof HttpEntityEnclosingRequestBase) {
    //	            checkArgument(null!=entity,"HttpEntity请求体不能为空");
                ((HttpEntityEnclosingRequestBase) httpRequest).setEntity(entity);
            }
    
            //忽略证书
            SSLContext sslContext = SSLContexts.createDefault();
    
            X509TrustManager tm = new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] xcs,
                                               String string) throws CertificateException {
                }
    
                public void checkServerTrusted(X509Certificate[] xcs,
                                               String string) throws CertificateException {
                }
    
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
    
            try {
                sslContext.init(null, new TrustManager[]{tm}, null);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
    
            X509HostnameVerifier hostnameVerifier = new AllowAllHostnameVerifier();
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
    
            Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create()
                    .register("https", sslsf)
                    .build();
    
            HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);
            CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
    
    
            CloseableHttpResponse response = null;
            String resString = null;
            try {
                response = httpClient.execute(httpRequest);
                HttpEntity resEntity = response.getEntity();
                int statusCode = response.getStatusLine().getStatusCode();
                resString = EntityUtils.toString(resEntity, "UTF-8");
                System.err.println(statusCode);
                if (statusCode != HttpStatus.SC_OK) {
                    System.out.println("响应码状态不是200");
                }
                return resString;
            } catch (Exception e) {
                throw new RuntimeException(resString, e);
            } finally {
                try {
                    if (response != null) {
                        response.close();
                    }
                    if (httpRequest != null) {
                        httpRequest.releaseConnection();
                    }
                    if (httpClient != null) {
                        httpClient.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    
    }
    
    

    调用示例:

    public static void delAll(){
            String url = path+"test/test/deleteAll";
            Map map = new HashMap<>();
            String str = HttpClientUtils.invokePost(url,map);
            System.out.println("delAll.str="+str);
        }
    
  • 相关阅读:
    Docker多主机互联
    数据结构
    广度优先算法走出迷宫
    golang反射
    waitGroup的使用
    golang中的mutex锁
    goroutine和channel
    如何优雅的关闭Golang Channel?
    使用context关闭协程以及协程中的协程
    golang对不同系统的编译
  • 原文地址:https://www.cnblogs.com/jianquan100/p/13690588.html
Copyright © 2020-2023  润新知