Files
Arbitrate-Backend/ruoyi-system/src/main/java/com/ruoyi/bestsign/utils/HttpClientSender.java
T

391 lines
15 KiB
Java

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<String, CloseableHttpClient> httpClients = new HashMap<String, CloseableHttpClient>();
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<String, Object> 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<String, Object> 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<String, Object> request(String method, String url, Object sendData, Map<String, String> 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<String, Object> response = null;
if ("POST".equals(method)) {
response = sendPost(httpClient, url, headers, sendData);
} else {
response = sendGet(httpClient, url, headers);
}
return response;
}
private static Map<String, Object> sendPost(CloseableHttpClient httpClient, String url, Map<String, String> 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<String, Object> response = new HashMap<String, Object>();
response.put("responseCode", responseCode);
response.put("responseData", responseBytes);
String loggerResponseString = getLoggerString(responseBytes, 256);
return response;
}
private static Map<String, Object> sendGet(CloseableHttpClient httpClient, String url, Map<String, String> 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<String, Object> response = new HashMap<String, Object>();
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<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>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;
}
}
}