CloseableHttpClient设置请求超时时间

4,211 阅读2分钟

直接上代码,记录一下

/**
 * 用于Http请求相关的工具类
 */
public class HttpUtils {
    /**
     * http请求的返回码
     */
    private static final int RESPONSE_SUCCESS_CODE = 200;
    /**
     * 是否是https协议请求
     */
    private final static String HTTPS_URL_PREFIX = "https";

    /**
     * 判断当前url是否可以访问成功
     * @param url 用于访问的url
     * @return true:表示成功,false:表示失败
     */
    public static boolean accessSuccess(String url) {
        try {
            return doGet(url);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 采用get方式请求供应商接口
     *
     * @param url 供应商url
     * @return 是否请求成功
     * @throws Exception httpclient可能抛出异常
     */
    private static boolean doGet(String url) throws Exception {

        if (checkIsHttpsUrl(url)) {
            try(CloseableHttpClient httpclient = createSslClient()) {
                return processGet(url, httpclient);
            }
        } else {
            try(CloseableHttpClient httpclient = HttpClients.createDefault()) {
                return processGet(url,httpclient);
            }
        }
    }

    /**
     * 执行GET请求
     * @param url 请求地址
     * @param httpclient 请求客户端
     * @return true:请求成功,false:请求失败
     */
    private static boolean processGet(String url, CloseableHttpClient httpclient){
        HttpGet httpGet = new HttpGet(url);
        // 设置httpclient请求超时时间
        RequestConfig requestConfig = RequestConfig.custom()
            // 默认连接超时100ms
            .setConnectionRequestTimeout(100)
            // 请求超时400ms
            .setSocketTimeout(400)
            .build();
        // 具体执行请求
        httpGet.setConfig(requestConfig);
        return processRequest(httpclient, httpGet);
    }

    /**
     * 根据传入的请求方式进行请求
     *
     * @param httpclient 请求客户端
     * @param requestBase 请求方法 get、post、head
     * @return true:请求成功,false:请求失败
     */
    private static boolean processRequest(CloseableHttpClient httpclient, HttpRequestBase requestBase){
        // 执行供应商接口请求
        try (CloseableHttpResponse response = httpclient.execute(requestBase)) {
            int code = response.getStatusLine().getStatusCode();
            if (code > RESPONSE_SUCCESS_CODE) {
                return false;
            }
        } catch (IOException e) {
            return false;
        }
        return true;
    }

    /**
     * http协议头前缀匹配
     * @param url 请求url
     * @return 返回是否是https协议
     */
    private static boolean checkIsHttpsUrl(String url){
        url = StringUtils.trim(url);
        if (url.startsWith(HTTPS_URL_PREFIX)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 创建https client
     */
    private static CloseableHttpClient createSslClient() {
        RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
        ConnectionSocketFactory plainSf = new PlainConnectionSocketFactory();
        registryBuilder.register(PrivacyRecordingMccConfig.ProtocolConstant.HTTP, plainSf);

        //指定信任密钥存储对象和连接套接字工厂
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            //信任任何链接
            TrustStrategy anyTrustStrategy = new TrustStrategy() {
                @Override
                public boolean isTrusted(X509Certificate[] x509Certificates, String s){
                    return true;
                }
            };
            SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy).build();
            LayeredConnectionSocketFactory sslSf = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            registryBuilder.register("https", sslSf);
        } catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {
            throw new RuntimeException(e);
        }
        Registry<ConnectionSocketFactory> registry = registryBuilder.build();
        //设置连接管理器
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);
        //构建客户端
        return HttpClientBuilder.create().setConnectionManager(connManager).setDefaultHeaders(new ArrayList<Header>()).build();
    }
}