/*
* Copyright (c) Huawei Technologies Co., Ltd. 2019-2019. All rights reserved.
*/
package com.huawei.peripheral.servicecall.Utils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.CookieStore;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPatch;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.config.ConnectionConfig;
import org.apache.http.config.MessageConstraints;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.config.SocketConfig;
import org.apache.http.conn.DnsResolver;
import org.apache.http.conn.HttpConnectionFactory;
import org.apache.http.conn.ManagedHttpClientConnection;
import org.apache.http.conn.routing.HttpRoute;
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.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.DefaultHttpResponseFactory;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.BasicCredentialsProvider;
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.DefaultHttpResponseParser;
import org.apache.http.impl.conn.DefaultHttpResponseParserFactory;
import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.conn.SystemDefaultDnsResolver;
import org.apache.http.impl.io.DefaultHttpRequestWriterFactory;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.io.HttpMessageParserFactory;
import org.apache.http.io.HttpMessageWriterFactory;
import org.apache.http.io.SessionInputBuffer;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicLineParser;
import org.apache.http.message.LineParser;
import org.apache.http.util.CharArrayBuffer;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.CodingErrorAction;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
* 功能描述 HttpUtil
*
* @since 2019-09-03
*/
@Configuration
public class HttpUtil {
/**
* APPLICATION_JSON
*/
public static final String APPLICATION_JSON = "application/json";
/**
* 字符串格式
*/
public static final String UTF8 = "utf-8";
@Value("${httpclient.max.pool}")
public int maxPool;
@Value("${httpclient.max.perroute}")
public int maxPerRoute;
@Value("${httpclient.connect.timeout}")
public int connectTimeOut;
@Value("${httpclient.socket.timeout}")
public int socketTimeOut;
@Value("${httpclient.connection.request.timeout}")
public int connectionRequestTimeOut;
/**
* 单例
*/
//public static final HttpUtil INSTANCE = new HttpUtil();
private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
// HTTP Get请求(POST雷同)
//RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000).build();
//private CloseableHttpClient httpClient;
@Bean
public CloseableHttpClient getHttpUtilClient(){
PoolingHttpClientConnectionManager connManager = getClientConnectionManager();
SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build();
connManager.setDefaultSocketConfig(socketConfig);
connManager.setValidateAfterInactivity(1000);
MessageConstraints messageConstraints =
MessageConstraints.custom().setMaxHeaderCount(200).setMaxLineLength(2000).build();
ConnectionConfig connectionConfig = ConnectionConfig.custom()
.setMalformedInputAction(CodingErrorAction.IGNORE)
.setUnmappableInputAction(CodingErrorAction.IGNORE)
.setCharset(Consts.UTF_8)
.setMessageConstraints(messageConstraints)
.build();
connManager.setDefaultConnectionConfig(connectionConfig);
connManager.setMaxTotal(maxPool);
connManager.setDefaultMaxPerRoute(maxPerRoute);
CookieStore cookieStore = new BasicCookieStore();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT)
.setExpectContinueEnabled(true)
.setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
.setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
.setConnectTimeout(connectTimeOut)
.setSocketTimeout(socketTimeOut)
.setConnectionRequestTimeout(connectionRequestTimeOut)
.build();
HttpClientBuilder builder = HttpClients.custom().setConnectionManager(connManager);
builder.setDefaultCookieStore(cookieStore);
builder.setDefaultCredentialsProvider(credentialsProvider);
builder.setDefaultRequestConfig(defaultRequestConfig);
// 创建自定义的httpclient对象
//httpClient = builder.build();
return builder.build();
}
/**
* 项目报文格式转换工厂
*
* @return responseParserFactory
*/
private HttpMessageParserFactory<HttpResponse> getResponseParserFactory() {
HttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {
@Override
public HttpMessageParser<HttpResponse> create(SessionInputBuffer buffer, MessageConstraints constraints) {
LineParser lineParser = new BasicLineParser() {
@Override
public Header parseHeader(CharArrayBuffer buffer) {
try {
return super.parseHeader(buffer);
} catch (Exception ex) {
return new BasicHeader(buffer.toString(), "");
}
}
};
return new DefaultHttpResponseParser(buffer, lineParser, DefaultHttpResponseFactory.INSTANCE,
constraints) {
@Override
protected boolean reject(CharArrayBuffer line, int count) {
// try to ignore all garbage preceding a status line
// infinitely
return false;
}
};
}
};
return responseParserFactory;
}
private PoolingHttpClientConnectionManager getClientConnectionManager() {
HttpMessageParserFactory<HttpResponse> responseParserFactory = getResponseParserFactory();
HttpMessageWriterFactory<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();
HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory =
new ManagedHttpClientConnectionFactory(requestWriterFactory, responseParserFactory);
// 采用绕过验证的方式处理https请求
SSLContext sslcontext = null;
try {
sslcontext = SSLContextUtil.createIgnoreVerifySSL();
} catch (NoSuchAlgorithmException e) {
System.out.println("init exception......");
} catch (KeyManagementException e) {
System.out.println("init exception......");
}
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https",
new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER))
.build();
DnsResolver dnsResolver = new SystemDefaultDnsResolver() {
@Override
public InetAddress[] resolve(String host) throws UnknownHostException {
if ("myhost".equalsIgnoreCase(host)) {
return new InetAddress[]{InetAddress.getByAddress(new byte[]{127, 0, 0, 1})};
} else {
return super.resolve(host);
}
}
};
PoolingHttpClientConnectionManager connManager =
new PoolingHttpClientConnectionManager(socketFactoryRegistry, connFactory, dnsResolver);
return connManager;
}
/**
* sendGetReq
*
* @param url url
* @param header header
* @param param param
* @return HttpResp
*/
public HttpResp sendGetReq(String url, Map<String, String> header, Map<String, Object> param) {
HttpGet httpget = new HttpGet(buildGetUrl(url, param));
// 设置请求和传输超时时间
//httpget.setConfig(requestConfig);
return sendReq(httpget, header);
}
/**
* sendGetReq
*
* @param url url
* @param header header
* @return HttpResp
*/
public HttpResp sendGetReq(String url, Map<String, String> header) {
HttpGet httpget = new HttpGet(url);
// 设置请求和传输超时时间
//httpget.setConfig(requestConfig);
return sendReq(httpget, header);
}
/**
* sendPostReq
*
* @param url url
* @param header header
* @param jsonParams jsonParams
* @return HttpResp
*/
public HttpResp sendPostReq(String url, Map<String, String> header, String jsonParams) {
HttpPost httpPost = new HttpPost(url);
// 设置请求和传输超时时间
//httpPost.setConfig(requestConfig);
return sendJsonReq(httpPost, header, jsonParams);
}
/**
* 设置post请求超时时间
*
* @param url url
* @param header header
* @param jsonParams jsonParams
* @param second second
* @return HttpResp
*/
public HttpResp sendPostReqLong(String url, Map<String, String> header, String jsonParams, int second) {
HttpPost httpPost = new HttpPost(url);
if (second > 0) {
RequestConfig requestTime =
RequestConfig.custom().setSocketTimeout(second * 1000).setConnectTimeout(second * 1000).build();
// 设置请求和传输超时时间
httpPost.setConfig(requestTime);
}
return sendJsonReq(httpPost, header, jsonParams);
}
/**
* sendPutReq
*
* @param url url
* @param header header
* @param jsonParams 参数
* @return HttpResp
*/
public HttpResp sendPutReq(String url, Map<String, String> header, String jsonParams) {
HttpPut httpPut = new HttpPut(url);
return sendJsonReq(httpPut, header, jsonParams);
}
/**
* sendPatchReq
*
* @param url url
* @param header header
* @param jsonParams 参数
* @return HttpResp
*/
public HttpResp sendPatchReq(String url, Map<String, String> header, String jsonParams) {
HttpPatch httpPatch = new HttpPatch(url);
return sendJsonReq(httpPatch, header, jsonParams);
}
/**
* sendDeleteReq
*
* @param url url
* @param header url
* @return HttpResp
*/
public HttpResp sendDeleteReq(String url, Map<String, String> header) {
HttpDelete httpDelete = new HttpDelete(url);
// 设置请求和传输超时时间
//httpDelete.setConfig(requestConfig);
return sendReq(httpDelete, header);
}
/**
* sendReq
*
* @param httpRequest httpRequest
* @param headers headers
* @return HttpResp
*/
private HttpResp sendReq(HttpRequestBase httpRequest, Map<String, String> headers) {
HttpResp resp = new HttpResp();
// 设置请求头
setHeader(httpRequest, headers);
try {
CloseableHttpResponse response = getHttpUtilClient().execute(httpRequest);
String respBody = null;
if (response.getEntity() != null) {
respBody = EntityUtils.toString(response.getEntity());
}
StatusLine statusLine = response.getStatusLine();
resp.setHttpStatus(statusLine.getStatusCode());
resp.setRespContent(respBody);
Header[] headerArr = response.getAllHeaders();
if (headerArr != null) {
Map<String, String> headerMap = new HashMap<>();
for (Header header : headerArr) {
headerMap.put(header.getName(), header.getValue());
}
resp.setRespHeader(headerMap);
}
} catch (IOException e) {
logger.error("send Req:",e);
System.out.println("Failed to sendReq,url=" + httpRequest.getURI());
} finally {
httpRequest.releaseConnection();
}
return resp;
}
/**
* sendJsonReq
*
* @param httpRequest httpRequest
* @param header header
* @param jsonParams jsonParams
* @return HttpResp
*/
private HttpResp sendJsonReq(HttpEntityEnclosingRequestBase httpRequest, Map<String, String> header,
String jsonParams) {
if (!StringUtils.isEmpty(jsonParams)) {
httpRequest.setEntity(new StringEntity(jsonParams, ContentType.create(APPLICATION_JSON, UTF8)));
}
return sendReq(httpRequest, header);
}
/**
* 设置HTTP请求头
*
* @param httpRequest httpRequest
* @param header header
*/
private void setHeader(HttpRequestBase httpRequest, Map<String, String> header) {
if (header == null || header.isEmpty()) {
return;
}
for (Entry<String, String> entry : header.entrySet()) {
httpRequest.addHeader(entry.getKey(), entry.getValue());
}
}
/**
* 拼接GET请求的URL和参数
*
* @param url url
* @param body body
* @return String
*/
private String buildGetUrl(String url, Map<String, Object> body) {
StringBuffer realPath = new StringBuffer();
realPath.append(url);
if (!url.contains("?")) {
realPath.append("?");
} else {
realPath.append("&");
}
if (body != null && !body.isEmpty()) {
for (Entry<String, Object> entry : body.entrySet()) {
realPath.append(entry.getKey()).append("=").append(String.valueOf(entry.getValue())).append("&");
}
}
realPath.deleteCharAt(realPath.length() - 1);
return realPath.toString();
}
}
这个是4的,我要改为5的版本