package com.example.demo.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.*;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
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.client.utils.HttpClientUtils;
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.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.message.BasicHeader;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Slf4j
public class HttpClientUtil {
private static final HttpClientBuilder httpClientBulider = HttpClients.custom();
static {
/**
* 一、绕过不安全的Https请求的证书验证
*/
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", trustHttpsCertificates())
.build();
/**
* 二、创建连接池
*/
PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager(registry);
pool.setMaxTotal(50);//设置最大连接池连接数
pool.setDefaultMaxPerRoute(50);//设置最大路由连接
httpClientBulider.setConnectionManager(pool);
//设置请求连接时长
RequestConfig requestConfig = RequestConfig.custom()
//连接超时时间
.setConnectTimeout(5000)
//读取时间
.setSocketTimeout(3000)
//从连接池获取时间
.setConnectionRequestTimeout(5000)
.build();
List<Header> headers = new ArrayList<>();
BasicHeader userAgentHeader = new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36");
headers.add(userAgentHeader);
httpClientBulider.setDefaultHeaders(headers);
}
//构建安全工厂
private static ConnectionSocketFactory trustHttpsCertificates() {
SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
try {
sslContextBuilder.loadTrustMaterial(null,new TrustStrategy(){
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
//判断是否信任URL
return true;
}
});
SSLContext sslContext =sslContextBuilder.build();
SSLConnectionSocketFactory sslConnectionSocketFactory = new
SSLConnectionSocketFactory(sslContext,new String[]{"SSLv2Hello","SSLv3","TLSv1","TLSv1.2"},null, NoopHostnameVerifier.INSTANCE);
return sslConnectionSocketFactory;
} catch (Exception e) {
e.printStackTrace();
log.error("构造安全工厂失败",e);
throw new RuntimeException("构造安全连接工厂失败");
}
}
//发送get请求
public static String exeuteGet(String url, Map<String,String> headers){
CloseableHttpClient closeableHttpClient = httpClientBulider.build();
//构造httpGet请求对象
HttpGet httpGet = new HttpGet(url);
if(headers != null){
Set<Map.Entry<String,String>> entries = headers.entrySet();
for (Map.Entry<String,String> entry :entries){
httpGet.addHeader(new BasicHeader(entry.getKey(), entry.getValue()));
}
}
CloseableHttpResponse response = null;
try {
//获取数据
response = closeableHttpClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "UTF-8");
return html;
}else {
log.error("响应失败,响应码为:"+response.getStatusLine().getStatusCode());
}
}catch (Exception e){
log.error("连接失败,error,url:{}",url,e);
}finally {
HttpClientUtils.closeQuietly(closeableHttpClient);
HttpClientUtils.closeQuietly(response);
}
return null;
}
//发送表单类型的Post
public static String exeutePost(String url, List<NameValuePair> list, Map<String, String> headers){
CloseableHttpClient closeableHttpClient = httpClientBulider.build();
//构造httpGet请求对象
HttpPost httpPost = new HttpPost(url);
if(headers != null){
Set<Map.Entry<String,String>> entries = headers.entrySet();
for (Map.Entry<String,String> entry :entries){
httpPost.addHeader(new BasicHeader(entry.getKey(), entry.getValue()));
}
}
httpPost.addHeader("content-type","application/x-www-form-urlencoded; charset=UTF-8");
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(list, Consts.UTF_8);
CloseableHttpResponse response = null;
try {
//获取数据
response = closeableHttpClient.execute(httpPost);
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "UTF-8");
return html;
}else {
log.error("响应失败,响应码为:"+response.getStatusLine().getStatusCode());
}
}catch (Exception e){
log.error("连接失败,error,url:{}",url,e);
}finally {
HttpClientUtils.closeQuietly(closeableHttpClient);
HttpClientUtils.closeQuietly(response);
}
return null;
}
//发送JSON类型的Post
public static String exeutePostJSON(String url, String body, Map<String, String> headers){
CloseableHttpClient closeableHttpClient = httpClientBulider.build();
//构造httpGet请求对象
HttpPost httpPost = new HttpPost(url);
if(headers != null){
Set<Map.Entry<String,String>> entries = headers.entrySet();
for (Map.Entry<String,String> entry :entries){
httpPost.addHeader(new BasicHeader(entry.getKey(), entry.getValue()));
}
}
httpPost.addHeader("content-type","application/json; charset=UTF-8");
/**
* 设置请求体
*/
StringEntity jsonEntity = new StringEntity(body,Consts.UTF_8);
jsonEntity.setContentType("application/json; charset=UTF-8");
jsonEntity.setContentEncoding(Consts.UTF_8.name());
httpPost.setEntity(jsonEntity);
CloseableHttpResponse response = null;
try {
//获取数据
response = closeableHttpClient.execute(httpPost);
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "UTF-8");
return html;
}else {
log.error("响应失败,响应码为:"+response.getStatusLine().getStatusCode());
}
}catch (Exception e){
log.error("连接失败,error,url:{}",url,e);
}finally {
HttpClientUtils.closeQuietly(closeableHttpClient);
HttpClientUtils.closeQuietly(response);
}
return null;
}
}
http连接工具类
最新推荐文章于 2022-07-03 19:21:03 发布