http连接工具类

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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值