All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.mxixm.fastboot.weixin.controller.invoker.component.WxApiHttpRequestFactory Maven / Gradle / Ivy

The newest version!
package com.mxixm.fastboot.weixin.controller.invoker.component;

import com.mxixm.fastboot.weixin.config.WxProperties;
import com.mxixm.fastboot.weixin.exception.WxAppException;
import org.apache.http.Header;
import org.apache.http.client.HttpClient;
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.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultHttpRequestRetryHandler;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.net.URI;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * FastBootWeixin  WxApiHttpRequestFactory
 * 装饰器,装饰器,还是装饰器
 *
 * @author Guangshan
 * @summary FastBootWeixin  WxApiHttpRequestFactory
 * @Copyright (c) 2017, Guangshan Group All Rights Reserved
 * @since 2017/8/13 16:18
 */
public class WxApiHttpRequestFactory implements ClientHttpRequestFactory {

    private WxProperties wxProperties;

    private ClientHttpRequestFactory delegate;

    public WxApiHttpRequestFactory(WxProperties wxProperties) {
        this.wxProperties = wxProperties;
        this.delegate = getClientHttpRequestFactory();
    }

    /**
     * 获取连接工厂
     * @return dummy
     */
    private ClientHttpRequestFactory getClientHttpRequestFactory() {
        HttpClient httpClient = getHttpClient();
        // httpClient连接配置,底层是配置RequestConfig
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        // 连接超时
        clientHttpRequestFactory.setConnectTimeout(wxProperties.getInvoker().getConnectTimeout());
        // 数据读取超时时间,即SocketTimeout
        clientHttpRequestFactory.setReadTimeout(wxProperties.getInvoker().getReadTimeout());
        // 连接不够用的等待时间,不宜过长,必须设置,比如连接不够用时,时间过长将是灾难性的
        clientHttpRequestFactory.setConnectionRequestTimeout(wxProperties.getInvoker().getConnectionRequestTimeout());
        return clientHttpRequestFactory;
    }

    /**
     * 获取HttpClient,判断是否启用HTTPS
     * @return dummy
     */
    private HttpClient getHttpClient() {
        HttpClientBuilder builder = HttpClientBuilder.create();
        // 长连接保持30秒
        PoolingHttpClientConnectionManager pollingConnectionManager;
        if (wxProperties.getInvoker().isEnableHttps()) {
            SSLContext sslContext;
            try {
                sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true).build();
            } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
                throw new WxAppException("初始化HTTPS失败", e);
            }
            builder.setSSLContext(sslContext);
            // don't check Hostnames, either.
            //      -- use SSLConnectionSocketFactory.getDefaultHostnameVerifier(), if you don't want to weaken
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            // here's the special part:
            //      -- need to builder an SSL Socket Factory, to use our weakened "trust strategy";
            //      -- and builder a Registry, to register it.
            SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
            Registry socketFactoryRegistry = RegistryBuilder.create()
                    .register("http", PlainConnectionSocketFactory.getSocketFactory())
                    .register("https", sslSocketFactory)
                    .build();
            // now, we builder connection-manager using our Registry.
            //      -- allows multi-threaded use
            pollingConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, null, null, null, wxProperties.getInvoker().getTimeToLive(), TimeUnit.SECONDS);
        } else {
            pollingConnectionManager = new PoolingHttpClientConnectionManager(wxProperties.getInvoker().getTimeToLive(), TimeUnit.SECONDS);
        }
        // 总连接数
        pollingConnectionManager.setMaxTotal(wxProperties.getInvoker().getMaxTotal());
        // 同路由的并发数
        pollingConnectionManager.setDefaultMaxPerRoute(wxProperties.getInvoker().getMaxPerRoute());
        builder.setConnectionManager(pollingConnectionManager);
        // 重试次数,默认是2次,没有开启
        builder.setRetryHandler(new DefaultHttpRequestRetryHandler(wxProperties.getInvoker().getRetryCount(), wxProperties.getInvoker().isRequestSentRetryEnabled()));
        // 保持长连接配置,需要在头添加Keep-Alive
        builder.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE);
        List
headers = new ArrayList<>(); headers.add(new BasicHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36")); headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate")); headers.add(new BasicHeader("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6")); headers.add(new BasicHeader("Connection", "keep-alive")); builder.setDefaultHeaders(headers); return builder.build(); } @Override public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException { return new WxApiHttpRequest(this.delegate.createRequest(uri, httpMethod)); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy