250 lines
9.6 KiB
Java
250 lines
9.6 KiB
Java
|
|
package com.engine.salary.util;
|
|||
|
|
|
|||
|
|
|
|||
|
|
import com.engine.salary.entity.taxagent.response.SzyhResponseHead;
|
|||
|
|
import com.engine.salary.entity.taxpayment.response.BaseResponse;
|
|||
|
|
import lombok.extern.slf4j.Slf4j;
|
|||
|
|
import org.apache.http.Consts;
|
|||
|
|
import org.apache.http.HttpEntity;
|
|||
|
|
import org.apache.http.HttpResponse;
|
|||
|
|
import org.apache.http.client.HttpClient;
|
|||
|
|
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.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.ConnectTimeoutException;
|
|||
|
|
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.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.util.EntityUtils;
|
|||
|
|
|
|||
|
|
import javax.net.ssl.SSLContext;
|
|||
|
|
import javax.net.ssl.TrustManager;
|
|||
|
|
import javax.net.ssl.X509TrustManager;
|
|||
|
|
import java.io.IOException;
|
|||
|
|
import java.security.KeyManagementException;
|
|||
|
|
import java.security.NoSuchAlgorithmException;
|
|||
|
|
import java.security.cert.X509Certificate;
|
|||
|
|
import java.util.Arrays;
|
|||
|
|
import java.util.Collections;
|
|||
|
|
import java.util.Map;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* Http调用处理类
|
|||
|
|
*
|
|||
|
|
* @author Terry
|
|||
|
|
*/
|
|||
|
|
@Slf4j
|
|||
|
|
public class HttpUtil {
|
|||
|
|
|
|||
|
|
public static final String TEXT_TYPE = "text/plain";
|
|||
|
|
public static final String JSON_TYPE = "application/json";
|
|||
|
|
public static final String XML_TYPE = "text/xml";
|
|||
|
|
public static final String HTML_TYPE = "text/html";
|
|||
|
|
|
|||
|
|
public static final String EXCEL_TYPE = "application/vnd.ms-excel";
|
|||
|
|
public static final String STREAM_TYPE = "application/octet-stream";
|
|||
|
|
public static final int SLEEP_TIME = 1000;
|
|||
|
|
public static final int IAS_SUCCESS = 400;
|
|||
|
|
|
|||
|
|
public static HttpClient httpsTrustClient() {
|
|||
|
|
try {
|
|||
|
|
// 在调用SSL之前需要重写验证方法,取消检测SSL
|
|||
|
|
X509TrustManager trustManager = new X509TrustManager() {
|
|||
|
|
@Override
|
|||
|
|
public X509Certificate[] getAcceptedIssuers() {
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public void checkClientTrusted(X509Certificate[] xcs, String str) {
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public void checkServerTrusted(X509Certificate[] xcs, String str) {
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);
|
|||
|
|
ctx.init(null, new TrustManager[]{trustManager}, null);
|
|||
|
|
SSLConnectionSocketFactory socketFactory =
|
|||
|
|
new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);
|
|||
|
|
// 创建Registry
|
|||
|
|
RequestConfig requestConfig =
|
|||
|
|
RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).setExpectContinueEnabled(Boolean.TRUE)
|
|||
|
|
.setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
|
|||
|
|
.setProxyPreferredAuthSchemes(Collections.singletonList(AuthSchemes.BASIC)).build();
|
|||
|
|
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
|
|||
|
|
.register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build();
|
|||
|
|
// 创建ConnectionManager,添加Connection配置信息
|
|||
|
|
PoolingHttpClientConnectionManager connectionManager =
|
|||
|
|
new PoolingHttpClientConnectionManager(socketFactoryRegistry);
|
|||
|
|
|
|||
|
|
return HttpClients.custom().setConnectionManager(connectionManager)
|
|||
|
|
.setDefaultRequestConfig(requestConfig).build();
|
|||
|
|
} catch (KeyManagementException | NoSuchAlgorithmException ex) {
|
|||
|
|
throw new RuntimeException(ex);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取 HttpClient
|
|||
|
|
*
|
|||
|
|
* @param path
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
public static HttpClient wrapClient(String path) {
|
|||
|
|
HttpClient httpClient = HttpClientBuilder.create().build();
|
|||
|
|
if (path != null && path.startsWith("https://")) {
|
|||
|
|
return httpsTrustClient();
|
|||
|
|
}
|
|||
|
|
return httpClient;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 设置http超时时间
|
|||
|
|
*
|
|||
|
|
* @param requestConfig
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
private static RequestConfig setTimeOutConfig(RequestConfig requestConfig) {
|
|||
|
|
if (requestConfig == null) {
|
|||
|
|
requestConfig = RequestConfig.DEFAULT;
|
|||
|
|
}
|
|||
|
|
return RequestConfig.copy(requestConfig).setConnectionRequestTimeout(900000).setConnectTimeout(900000)
|
|||
|
|
.setSocketTimeout(900000).build();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* get 请求
|
|||
|
|
*
|
|||
|
|
* @param url
|
|||
|
|
* @param header
|
|||
|
|
* @param params
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
public static String getRequest(String url, Map<String, String> header, Map<String, String> params) {
|
|||
|
|
CloseableHttpClient httpClient = null;
|
|||
|
|
CloseableHttpResponse response = null;
|
|||
|
|
String result = "";
|
|||
|
|
|
|||
|
|
StringBuilder urlStr = new StringBuilder();
|
|||
|
|
urlStr.append(url).append("?");
|
|||
|
|
|
|||
|
|
int i = params.size();
|
|||
|
|
for (Map.Entry<String, String> map : params.entrySet()) {
|
|||
|
|
urlStr.append(map.getKey()).append("=").append(map.getValue());
|
|||
|
|
if ((--i) == 0) {
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
urlStr.append("&");
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
httpClient = (CloseableHttpClient) wrapClient(url);
|
|||
|
|
HttpGet httpGet = new HttpGet(urlStr.toString());
|
|||
|
|
if (null != header && !header.isEmpty()) {
|
|||
|
|
for (String key : header.keySet()) {
|
|||
|
|
httpGet.setHeader(key, header.get(key));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(20000)
|
|||
|
|
.setConnectionRequestTimeout(20000).setSocketTimeout(40000).build();
|
|||
|
|
httpGet.setConfig(requestConfig);
|
|||
|
|
response = httpClient.execute(httpGet);
|
|||
|
|
HttpEntity entity = response.getEntity();
|
|||
|
|
result = EntityUtils.toString(entity);
|
|||
|
|
httpGet.abort();
|
|||
|
|
EntityUtils.consume(entity);
|
|||
|
|
} catch (IOException e) {
|
|||
|
|
log.error("发起GET请求失败", e);
|
|||
|
|
result = getTimeoutErrorResponse(result, e);
|
|||
|
|
} finally {
|
|||
|
|
if (null != response) {
|
|||
|
|
try {
|
|||
|
|
httpClient.close();
|
|||
|
|
response.close();
|
|||
|
|
} catch (IOException e) {
|
|||
|
|
log.error("发起GET请求失败", e);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (null != httpClient) {
|
|||
|
|
try {
|
|||
|
|
httpClient.close();
|
|||
|
|
} catch (IOException e) {
|
|||
|
|
log.error("发起GET请求失败", e);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* HTTP Post 获取内容
|
|||
|
|
*
|
|||
|
|
* @param url 请求的url地址 ?之前的地址
|
|||
|
|
* @param params 请求的参数
|
|||
|
|
* @param header 编码格式
|
|||
|
|
* @return 页面内容
|
|||
|
|
*/
|
|||
|
|
public static String doPost(String url, Map<String, String> header, String params, String contentType) {
|
|||
|
|
String result = null;
|
|||
|
|
try {
|
|||
|
|
HttpPost httpPost = new HttpPost(url);
|
|||
|
|
httpPost.setHeader("Connection", "close");
|
|||
|
|
httpPost.setConfig(setTimeOutConfig(httpPost.getConfig()));
|
|||
|
|
httpPost.setHeader("Content-Type", contentType);
|
|||
|
|
if (null != header && !header.isEmpty()) {
|
|||
|
|
for (String key : header.keySet()) {
|
|||
|
|
httpPost.setHeader(key, header.get(key));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (null != params) {
|
|||
|
|
httpPost.setEntity(new StringEntity(params, Consts.UTF_8));
|
|||
|
|
}
|
|||
|
|
HttpClient httpClient = wrapClient(url);
|
|||
|
|
HttpResponse response = httpClient.execute(httpPost);
|
|||
|
|
int statusCode = response.getStatusLine().getStatusCode();
|
|||
|
|
if (statusCode != 200) {
|
|||
|
|
httpPost.abort();
|
|||
|
|
throw new RuntimeException("HttpClient,error status code :" + statusCode);
|
|||
|
|
}
|
|||
|
|
HttpEntity entity = response.getEntity();
|
|||
|
|
if (entity != null) {
|
|||
|
|
result = EntityUtils.toString(entity, Consts.UTF_8);
|
|||
|
|
}
|
|||
|
|
EntityUtils.consume(entity);
|
|||
|
|
httpPost.abort();
|
|||
|
|
return result;
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
log.error("发起POST请求失败", e);
|
|||
|
|
result = getTimeoutErrorResponse(result, e);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static String getTimeoutErrorResponse(String result, Exception e) {
|
|||
|
|
if (e instanceof ConnectTimeoutException) {
|
|||
|
|
BaseResponse baseResponse = new BaseResponse();
|
|||
|
|
SzyhResponseHead head = new SzyhResponseHead();
|
|||
|
|
head.setCode("-1");
|
|||
|
|
head.setMsg(SalaryI18nUtil.getI18nLabel(184072, "抱歉,系统因网络原因无法访问税局个税系统,此功能暂时无法使用,请确保网络情况正常且允许访问外网"));
|
|||
|
|
head.setDesc("失败");
|
|||
|
|
head.setStatus("N");
|
|||
|
|
baseResponse.setHead(head);
|
|||
|
|
result = JsonUtil.toJsonString(baseResponse);
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
}
|