package api.common.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.util.Map;
/**
*
* org.apache.httpcomponents
* httpclient
* ${http.client.version}
*
*/
@Slf4j
public class HttpUtil {
// public static CloseableHttpClient getHttpClient() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
//
// PlainConnectionSocketFactory plainConnectionSocketFactory = new PlainConnectionSocketFactory();
// SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
// SSLContextBuilder.create().loadTrustMaterial(null, (x509Certificates, s) -> true).build(), // 全部信任 不做身份鉴定
// new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"},
// null,
// NoopHostnameVerifier.INSTANCE);
// Registry registry = RegistryBuilder.create()
// .register("http", plainConnectionSocketFactory)
// .register("https", sslConnectionSocketFactory)
// .build();
// PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager(registry);
// pool.setMaxTotal(300);
// pool.setDefaultMaxPerRoute(300);
// return HttpClients.custom().setConnectionManager(pool).build();
// }
public static CloseableHttpClient getHttpClient() {
return getCloseableHttpClient();
}
private static CloseableHttpClient getCloseableHttpClient() {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
X509TrustManager x509TrustManager = new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) {
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) {
}
};
sslContext.init(null, new TrustManager[]{x509TrustManager}, null);
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
// PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager();
// pool.setMaxTotal(300);
// pool.setDefaultMaxPerRoute(300);
// return HttpClients.custom().setConnectionManager(pool).setSSLSocketFactory(sslConnectionSocketFactory).build();
return HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();
} catch (Exception exception) {
throw new RuntimeException("获取 httpClient 失败。", exception);
}
}
public static RequestConfig getRequestConfig() {
return RequestConfig.custom()
.setSocketTimeout(60000)
.setConnectTimeout(60000)
.setConnectionRequestTimeout(60000)
.build();
}
/**
* 发送本地文件
*
* @param url http请求路径
* @param file 文件对象
* @return 响应体
*/
public static String post(String url, File file) {
String result = null;
try {
CloseableHttpClient client = getCloseableHttpClient();
RequestConfig config = getRequestConfig();
//1 创建 post 请求
HttpPost post = new HttpPost(url);
post.setConfig(config);
//2 设置请求体
post.setEntity(MultipartEntityBuilder.create().setCharset(StandardCharsets.UTF_8).setMode(HttpMultipartMode.BROWSER_COMPATIBLE) //设置浏览器兼容模式
.addPart("file", new FileBody(file, ContentType.MULTIPART_FORM_DATA)).build());
//3 获取响应结果
HttpResponse response = client.execute(post);
HttpEntity responseEntity = response.getEntity();
result = EntityUtils.toString(responseEntity);
//4 关闭流
EntityUtils.consume(responseEntity);
return result;
} catch (org.apache.http.conn.ConnectTimeoutException cte) {
log.debug(url + " 请求超时。", cte);
log.info(url + " 请求超时。");
} catch (Exception e) {
log.info("请求 " + url + " 失败。", e);
}
return result;
}
/**
* 默认请求头的 get 请求,参数拼接到 url 上
*
* @param url 请求路径带参数
* @return 请求结果
*/
public static String get(String url) {
log.info("发送HTTP请求:" + url);
String result;
try {
//1 创建 GET 对象
HttpGet get = new HttpGet(url);
get.setConfig(getRequestConfig());
//2 执行获取请求结果
result = EntityUtils.toString(getCloseableHttpClient().execute(get).getEntity());
} catch (IOException e) {
throw new RuntimeException(e);
}
return result;
}
/**
* 默认请求头的 get 请求
*
* @param closeableHttpClient http 客户端
* @param requestConfig 请求配置
* @param url 请求路径带参数
* @return 请求结果
*/
public static String get(CloseableHttpClient closeableHttpClient, RequestConfig requestConfig, String url) {
log.info("发送HTTP请求:" + url);
String result = null;
try {
//1 创建 post 请求
HttpGet get = new HttpGet(url);
get.setConfig(requestConfig);
//2 发送请求
CloseableHttpResponse response = closeableHttpClient.execute(get);
//3 处理返回结果,如果状态码为200,就是正常返回
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
result = EntityUtils.toString(response.getEntity());
} else {
log.error(response.getEntity().toString());
throw new RuntimeException("请求错误:" + response);
}
} catch (org.apache.http.conn.ConnectTimeoutException cte) {
log.info(url + " 请求超时。", cte);
} catch (Exception e) {
log.info("请求 " + url + " 失败。", e);
}
return result;
}
/**
* 带请求头的 get 请求
*
* @param closeableHttpClient http 客户端
* @param requestConfig 请求配置
* @param url 请求路径带参数
* @param headers 请求头
* @return 请求结果
* @throws IOException IO异常
*/
public static String get(CloseableHttpClient closeableHttpClient, RequestConfig requestConfig, String url,
Map headers) throws IOException {
//1 创建 post 请求
HttpGet get = new HttpGet(url);
//2 设置请求默认配置
get.setConfig(requestConfig);
//3 设置请求头 post.setHeader("Content-type", "application/json; charset=utf-8");
if (!CollectionUtil.isEmpty(headers)) {
headers.forEach(get::setHeader);
}
//4 发送请求
CloseableHttpResponse response = closeableHttpClient.execute(get);
//5 处理返回结果,
//5-1 如果状态码为200,就是正常返回
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
return EntityUtils.toString(response.getEntity());
} else {
throw new RuntimeException("------- 请求错误:" + statusCode);
}
}
/**
* 默认请求头的 get 请求下载文件
*
* @param url 请求地址
* @return 文件流
*/
public static InputStream getInputStream(String url) {
try {
log.info("发送请求:" + url);
CloseableHttpClient closeableHttpClient = getCloseableHttpClient();
RequestConfig requestConfig = getRequestConfig();
return getInputStream(closeableHttpClient, requestConfig, url, null);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 默认请求头的 get 请求下载文件
*
* @param url 请求地址
* @return 文件流
* @throws IOException 异常
*/
public static InputStream getInputStream(CloseableHttpClient closeableHttpClient, RequestConfig requestConfig, String url) throws IOException {
return getInputStream(closeableHttpClient, requestConfig, url, null);
}
/**
* 自定义请求头的 get 请求下载文件
*
* @param url 请求地址
* @param headers 请求头,可为 null
* @return 文件流
* @throws IOException 异常
*/
public static InputStream getInputStream(CloseableHttpClient closeableHttpClient, RequestConfig requestConfig, String url, Map headers) throws IOException {
InputStream result = null;
try {
//1 创建 post 请求
HttpGet get = new HttpGet(url);
//2 设置请求默认配置
get.setConfig(requestConfig);
//3 设置请求头 post.setHeader("Content-type", "application/json; charset=utf-8");
if (!CollectionUtil.isEmpty(headers)) {
headers.forEach(get::setHeader);
}
//4 发送请求
CloseableHttpResponse response = closeableHttpClient.execute(get);
//5 处理返回结果,
//5-1 如果状态码为200,就是正常返回
int statusCode = response.getStatusLine().getStatusCode();
log.info("请求 " + url + " 状态码为:" + statusCode);
if (statusCode == 200) {
result = response.getEntity().getContent();
}
} catch (Exception e) {
log.info("请求 " + url + " 失败。", e);
}
return result;
}
/**
* 自定义请求头的 post 请求
*/
public static String post(String url, Map headers, Map params){
log.info("发送HTTP请求:" + url+",请求参数:"+params+",请求头:"+headers);
try {
CloseableHttpClient closeableHttpClient = getCloseableHttpClient();
RequestConfig requestConfig = getRequestConfig();
//1 创建 post 请求
HttpPost post = new HttpPost(url);
//2 设置请求默认配置
post.setConfig(requestConfig);
//3 设置请求头 post.setHeader("Content-type", "application/json; charset=utf-8");
if (!CollectionUtil.isEmpty(headers)) {
headers.forEach(post::setHeader);
}
//4 设置请求体
post.addHeader("Content-Type", "application/json");
if (!CollectionUtil.isEmpty(params)) {
post.setEntity(new StringEntity(JsonUtil.beanToJson(params), "utf-8"));
}
//5 发送请求
CloseableHttpResponse response = closeableHttpClient.execute(post);
//6 处理返回结果,
//6-1 如果状态码为200,就是正常返回
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
return EntityUtils.toString(response.getEntity());
} else {
throw new RuntimeException("请求错误:" + statusCode);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 自定义请求头的 post 请求
*/
public static String post(CloseableHttpClient closeableHttpClient, RequestConfig requestConfig, String url, Map headers, Map params) throws IOException {
//1 创建 post 请求
HttpPost post = new HttpPost(url);
//2 设置请求默认配置
post.setConfig(requestConfig);
//3 设置请求头 post.setHeader("Content-type", "application/json; charset=utf-8");
if (!CollectionUtil.isEmpty(headers)) {
headers.forEach(post::setHeader);
}
//4 设置请求体
post.addHeader("Content-Type", "application/json");
if (!CollectionUtil.isEmpty(params)) {
post.setEntity(new StringEntity(JsonUtil.beanToJson(params), "utf-8"));
}
//5 发送请求
CloseableHttpResponse response = closeableHttpClient.execute(post);
//6 处理返回结果,
//6-1 如果状态码为200,就是正常返回
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
return EntityUtils.toString(response.getEntity());
} else {
throw new RuntimeException("请求错误:" + statusCode);
}
}
//
// /**
// * 通过 get 请求下载文件
// * 发送 get 请求,get 请求的参数在 url 里
// *
// * @param url 请求地址
// * @param headers 请求头,可为 null
// * @return 文件流
// * @throws IOException 异常
// */
// public static InputStream getDownload(String url, Map headers) throws IOException {
// //1 创建 post 请求
// HttpGet get = new HttpGet(url);
// //2 设置请求默认配置
// get.setConfig(requestConfig);
// //3 设置请求头 post.setHeader("Content-type", "application/json; charset=utf-8");
// if (!CollectionUtil.isEmpty(headers)) {
// headers.forEach(get::setHeader);
// }
// //4 发送请求
// CloseableHttpResponse response = httpClient.execute(get);
// //5 处理返回结果,
// //5-1 如果状态码为200,就是正常返回
// int statusCode = response.getStatusLine().getStatusCode();
// if (statusCode == 200) {
// return response.getEntity().getContent();
// } else {
// throw new RuntimeException("------- 请求错误:" + statusCode);
// }
// }
//
//
// /**
// * 发送 post 请求
// */
// public static InputStream postUpload(String url) throws IOException {
// //1 创建 post 请求
// HttpPost post = new HttpPost(url);
// //2 设置请求默认配置
// post.setConfig(requestConfig);
// //3 设置请求头 post.setHeader("Content-type", "application/json; charset=utf-8");
// post.setHeader("Content-type", "multipart/form-data");
// //5 发送请求
// CloseableHttpResponse response = httpClient.execute(post);
// //6 处理返回结果,
// //6-1 如果状态码为 200,就是正常返回
// int statusCode = response.getStatusLine().getStatusCode();
// if (statusCode == 200) {
// return response.getEntity().getContent();
// } else {
// throw new RuntimeException("------- 请求错误:" + statusCode);
// }
// }
//
// /**
// * 发送 post 请求
// */
// public static InputStream postDownload(String url, Map headers, Map params) throws IOException {
// //1 创建 post 请求
// HttpPost post = new HttpPost(url);
// //2 设置请求默认配置
// post.setConfig(requestConfig);
// //3 设置请求头 post.setHeader("Content-type", "application/json; charset=utf-8");
// if (!CollectionUtil.isEmpty(headers)) {
// headers.forEach(post::setHeader);
// }
// //4 设置请求体
// if (!CollectionUtil.isEmpty(params)) {
// params.forEach(post::setHeader);
// }
// //5 发送请求
// CloseableHttpResponse response = httpClient.execute(post);
// //6 处理返回结果,
// //6-1 如果状态码为 200,就是正常返回
// int statusCode = response.getStatusLine().getStatusCode();
// if (statusCode == 200) {
// return response.getEntity().getContent();
// } else {
// throw new RuntimeException("------- 请求错误:" + statusCode);
// }
// }
}