package com.ruoyi.bestsign.utils; import org.apache.http.HttpEntity; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; 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.SSLConnectionSocketFactory; 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.util.EntityUtils; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Map; public class HttpClientSender { private static PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = null; private static Map httpClients = new HashMap(); private static Object o = new Object(); public static String sendHttpPost(String host, String method, String urlParams, String sendData) throws IOException { String requestUrl = host + method + urlParams; Map response = request("POST", requestUrl, sendData, null); int responseCode = Integer.parseInt(response.get("responseCode").toString()); byte[] responseBytes = (byte[]) response.get("responseData"); String responseString; try { responseString = new String(responseBytes, "UTF-8"); } catch (UnsupportedEncodingException e) { responseString = new String(responseBytes); } //请求返回结果无论成功失败,http-status均为200 if (responseCode == 200) { //返回结果 return responseString; } else { throw new IOException(responseCode + ":" + responseString); } } public static byte[] sendHttpGet(String host, String method, String urlParams) throws IOException { String requestUrl = host + method + urlParams; Map response = request("GET", requestUrl, null, null); int responseCode = Integer.parseInt(response.get("responseCode").toString()); byte[] responseBytes = (byte[]) response.get("responseData"); //请求返回结果无论成功失败,http-status均为200 if (responseCode == 200) { //返回结果 return responseBytes; } else { throw new IOException(responseCode + ""); } } public static String urlencode(String data) { return urlencode(data, "UTF-8"); } public static String urlencode(String data, String charset) { try { return URLEncoder.encode(data, charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e.getMessage(), e); } } public static Map request(String method, String url, Object sendData, Map headers) throws IOException { String requestPath; try { requestPath = new URL(url).getPath(); } catch (MalformedURLException e) { throw new RuntimeException(e.getMessage(), e); } CloseableHttpClient httpClient = getHttpClient(requestPath); Map response = null; if ("POST".equals(method)) { response = sendPost(httpClient, url, headers, sendData); } else { response = sendGet(httpClient, url, headers); } return response; } private static Map sendPost(CloseableHttpClient httpClient, String url, Map headers, Object sendData) throws IOException { String tag = "[HttpRequester] [POST " + url + "]"; int responseCode = -1; byte[] responseBytes = null; HttpPost request = new HttpPost(url); if (headers != null && headers.size() > 0) { for (String name : headers.keySet()) { String value = headers.get(name); request.setHeader(name, value); } } if (sendData != null) { StringEntity stringEntity = new StringEntity((String) sendData, "UTF-8"); stringEntity.setContentType("application/json"); request.setEntity(stringEntity); HttpEntity httpEntity = null; IOException exception = null; for (int i = 0; i < 3; i++) { try { CloseableHttpResponse response = httpClient.execute(request); responseCode = response.getStatusLine().getStatusCode(); httpEntity = response.getEntity(); String responseBody = EntityUtils.toString(httpEntity, "utf-8"); if (responseBody != null) { responseBytes = responseBody.getBytes(); } else { InputStream respStream = null; try { respStream = httpEntity.getContent(); int respBodySize = respStream.available(); if (respBodySize <= 0) throw new IOException("Invalid respBodySize: " + respBodySize); responseBytes = new byte[respBodySize]; if (respStream.read(responseBytes) != respBodySize) throw new IOException("Read respBody Error"); } catch (Exception e) { } finally { if (respStream != null) { respStream.close(); } } } exception = null; break; } catch (UnsupportedOperationException e) { try { EntityUtils.consume(httpEntity); } catch (IOException e2) { } throw new RuntimeException(e.getMessage(), e); } catch (IOException e) { e.printStackTrace(); exception = e; try { EntityUtils.consume(httpEntity); } catch (IOException e2) { } if (i < 2) { try { Thread.sleep(5); } catch (InterruptedException e2) { } } } } if (exception != null) { throw exception; } } Map response = new HashMap(); response.put("responseCode", responseCode); response.put("responseData", responseBytes); String loggerResponseString = getLoggerString(responseBytes, 256); return response; } private static Map sendGet(CloseableHttpClient httpClient, String url, Map headers) throws IOException { String tag = "[HttpRequester] [GET " + url + "]"; int responseCode = -1; byte[] responseBytes = null; HttpGet request = new HttpGet(url); if (headers != null && headers.size() > 0) { for (String name : headers.keySet()) { String value = headers.get(name); request.setHeader(name, value); } } HttpEntity httpEntity = null; IOException exception = null; for (int i = 0; i < 3; i++) { try { CloseableHttpResponse response = httpClient.execute(request); responseCode = response.getStatusLine().getStatusCode(); httpEntity = response.getEntity(); byte[] responseBody = EntityUtils.toByteArray(httpEntity); if (responseBody != null) { responseBytes = responseBody; } else { InputStream respStream = null; try { respStream = httpEntity.getContent(); int respBodySize = respStream.available(); if (respBodySize <= 0) throw new IOException("Invalid respBodySize: " + respBodySize); responseBytes = new byte[respBodySize]; if (respStream.read(responseBytes) != respBodySize) throw new IOException("Read respBody Error"); } catch (Exception e) { } finally { if (respStream != null) { respStream.close(); } } } exception = null; break; } catch (UnsupportedOperationException e) { try { EntityUtils.consume(httpEntity); } catch (IOException e2) { } throw new RuntimeException(e.getMessage(), e); } catch (IOException e) { e.printStackTrace(); exception = e; try { EntityUtils.consume(httpEntity); } catch (IOException e2) { } if (i < 2) { try { Thread.sleep(5); } catch (InterruptedException e2) { } } } } if (exception != null) { throw exception; } Map response = new HashMap(); response.put("responseCode", responseCode); response.put("responseData", responseBytes); String loggerResponseString = getLoggerString(responseBytes, 256); System.out.println(tag + " response " + responseCode + " " + loggerResponseString); return response; } private static String getLoggerString(final byte[] data, int maxLength) { String loggerString; if (data.length > maxLength) { byte[] shortData = new byte[maxLength]; System.arraycopy(data, 0, shortData, 0, shortData.length); try { loggerString = new String(shortData, "UTF-8") + "..."; } catch (UnsupportedEncodingException e) { loggerString = new String(shortData) + "..."; } } else { try { loggerString = new String(data, "UTF-8"); } catch (UnsupportedEncodingException e) { loggerString = new String(data); } } char[] chars = new char[loggerString.length()]; loggerString.getChars(0, loggerString.length(), chars, 0); for (int i = 0; i < chars.length; i++) { char c = chars[i]; if (c == '\n' || c == '\r') { chars[i] = ' '; } } return new String(chars); } private static CloseableHttpClient getHttpClient(String requestPath) { if (httpClients.containsKey(requestPath)) { return httpClients.get(requestPath); } if (poolingHttpClientConnectionManager == null) { synchronized (o) { if (poolingHttpClientConnectionManager == null) { poolingHttpClientConnectionManager = HttpClientUtils.createHttpClientConnectionManager(); } } } synchronized (httpClients) { if (httpClients.containsKey(requestPath)) { return httpClients.get(requestPath); } CloseableHttpClient httpClient = HttpClientUtils.createHttpClient(poolingHttpClientConnectionManager); httpClients.put(requestPath, httpClient); return httpClient; } } private static class HttpClientUtils { // 默认连接超时 private static int defaultConnectTimeout = 6000; // 默认读取超时 private static int defaultReadTimeout = 30000; public static CloseableHttpClient createHttpClient(PoolingHttpClientConnectionManager connManager) { //HttpHost httpHost = new HttpHost("10.211.55.4", 8888); CloseableHttpClient httpClient = HttpClients.custom() //.setProxy(httpHost) .setConnectionManager(connManager) .disableContentCompression() .setSSLContext(getSslcontext()) .setDefaultRequestConfig(getRequestConfig()) .build(); return httpClient; } public static PoolingHttpClientConnectionManager createHttpClientConnectionManager() { SSLConnectionSocketFactory sslConnectionSocketFactory = null; try { sslConnectionSocketFactory = new SSLConnectionSocketFactory(getSslcontext(), SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } Registry socketFactoryRegistry = RegistryBuilder.create() .register("https", sslConnectionSocketFactory) .register("http", new PlainConnectionSocketFactory()) .build(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry); cm.setMaxTotal(500); cm.setDefaultMaxPerRoute(500); return cm; } private static RequestConfig getRequestConfig() { RequestConfig defaultRequestConfig = RequestConfig.custom() .setConnectionRequestTimeout(defaultConnectTimeout) .setSocketTimeout(defaultReadTimeout) .build(); return defaultRequestConfig; } private static SSLContext getSslcontext() { SSLContext sslContext = null; try { sslContext = SSLContext.getInstance("TLS"); TrustManager tm = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return null; } }; sslContext.init(null, new TrustManager[]{tm}, null); } catch (Exception e) { e.printStackTrace(); } return sslContext; } } }