package com.walker.web; import com.walker.infrastructure.ApplicationRuntimeException; import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.nio.charset.StandardCharsets; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.Iterator; import java.util.List; import java.util.concurrent.TimeUnit; /** * RestTemplate工厂创建对象。 * @author 时克英 * @date 2023-08-16 */ public class RestTemplateFactory { public static final RestTemplate createRestTemplate(HttpType httpType, RestTemplateConfig config){ if(config == null || httpType == null){ throw new IllegalArgumentException("请提供参数"); } if(httpType == HttpType.OkHttp){ try { return acquireHttpOkRestTemplate(config.getMaxIdleConnections(), config.getKeepAliveDurationSeconds() , config.getConnectTimeoutSeconds(), config.getReadTimeoutSeconds(), config.getWriteTimeoutSeconds()); } catch (Exception e) { throw new ApplicationRuntimeException("创建:RestTemplate失败, " + e.getMessage(), e); } } else { throw new UnsupportedOperationException("未实现其他方式http连接"); } } private static RestTemplate acquireHttpOkRestTemplate(int maxIdleConnections , long keepAliveDuration, long connectTimeout, long readTimeout, long writeTimeout) throws Exception{ ConnectionPool connectionPool = new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.SECONDS); OkHttpClient client = new OkHttpClient().newBuilder() .connectionPool(connectionPool) .connectTimeout(connectTimeout, TimeUnit.SECONDS) .readTimeout(readTimeout, TimeUnit.SECONDS) .writeTimeout(writeTimeout, TimeUnit.SECONDS) // .hostnameVerifier((hostname, session) -> true) .sslSocketFactory(getIgnoreInitSslContext().getSocketFactory(), IGNORE_SSL_TRUST_MANAGER_X509) .hostnameVerifier(getIgnoreSslHostnameVerifier()) // ssl相关,忽略否则https调用报证书错误 // 设置代理 // .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888))) // 拦截器 // .addInterceptor() .build(); ClientHttpRequestFactory factory = new OkHttp3ClientHttpRequestFactory(client); RestTemplate restTemplate = new RestTemplate(factory); setupRestTemplate(restTemplate); return restTemplate; } private static void setupRestTemplate(RestTemplate restTemplate){ List> messageConverters = restTemplate.getMessageConverters(); Iterator> iterator = messageConverters.iterator(); while(iterator.hasNext()){ HttpMessageConverter converter=iterator.next(); //原有的String是ISO-8859-1编码 去掉 if(converter instanceof StringHttpMessageConverter){ iterator.remove(); } } messageConverters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8)); } /** * Get initialized SSLContext instance which ignored SSL certification * * @return * @throws NoSuchAlgorithmException * @throws KeyManagementException */ public static SSLContext getIgnoreInitSslContext() throws NoSuchAlgorithmException, KeyManagementException { SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, new TrustManager[] { IGNORE_SSL_TRUST_MANAGER_X509 }, new SecureRandom()); return sslContext; } /** * X509TrustManager instance which ignored SSL certification */ public static final X509TrustManager IGNORE_SSL_TRUST_MANAGER_X509 = new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } }; public static HostnameVerifier getIgnoreSslHostnameVerifier() { return new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }; } public enum HttpType{ OkHttp, HttpClient; } // public class Config{ // // public int getMaxIdleConnections() { // return maxIdleConnections; // } // // public void setMaxIdleConnections(int maxIdleConnections) { // this.maxIdleConnections = maxIdleConnections; // } // // public long getKeepAliveDurationSeconds() { // return keepAliveDurationSeconds; // } // // public void setKeepAliveDurationSeconds(long keepAliveDurationSeconds) { // this.keepAliveDurationSeconds = keepAliveDurationSeconds; // } // // public long getConnectTimeoutSeconds() { // return connectTimeoutSeconds; // } // // public void setConnectTimeoutSeconds(long connectTimeoutSeconds) { // this.connectTimeoutSeconds = connectTimeoutSeconds; // } // // public long getReadTimeoutSeconds() { // return readTimeoutSeconds; // } // // public void setReadTimeoutSeconds(long readTimeoutSeconds) { // this.readTimeoutSeconds = readTimeoutSeconds; // } // // public long getWriteTimeoutSeconds() { // return writeTimeoutSeconds; // } // // public void setWriteTimeoutSeconds(long writeTimeoutSeconds) { // this.writeTimeoutSeconds = writeTimeoutSeconds; // } // // // 连接池中整体的空闲连接的最大数量 // private int maxIdleConnections = 100; // // 连接空闲时间最多为 300 秒 // private long keepAliveDurationSeconds = 300; // // 连接超时(秒) // private long connectTimeoutSeconds = 3; // // 读超时(秒) // private long readTimeoutSeconds = 3; // // 写超时(秒) // private long writeTimeoutSeconds = 3; // } }