package com.yuanian.common.extend;
import java.io.IOException;
import java.lang.reflect.Type;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.List;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
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.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.BufferedImageHttpMessageConverter;
import org.springframework.http.converter.ByteArrayHttpMessageConverter;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.ResourceHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import com.xneure.utils.JsonUtil;
import com.yuanian.common.JsonConverter;
public class HttpRestTemplate extends RestTemplate{
public HttpRestTemplate(){
this(getHttpRequestFactory());
}
private static HttpComponentsClientHttpRequestFactory getHttpRequestFactory(){
HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(createHttpClient());
// httpComponentsClientHttpRequestFactory.setConnectTimeout(1000);
// httpComponentsClientHttpRequestFactory.setConnectionRequestTimeout(1000);
return httpComponentsClientHttpRequestFactory;
}
public HttpRestTemplate(ClientHttpRequestFactory requestFactory,List<HttpMessageConverter<?>> messageConverters){
setRequestFactory(requestFactory);
setMessageConverters(messageConverters);
}
public HttpRestTemplate(ClientHttpRequestFactory requestFactory){
setRequestFactory(requestFactory);
List<HttpMessageConverter<?>> mc = getMessageConverters();
JsonConverter jsonConverter = new JsonConverter(){
@Override
protected void writeInternal(Object object,Type type,HttpOutputMessage outputMessage) throws IOException,HttpMessageNotWritableException{
outputMessage.getBody().write(JsonUtil.toJson(object).getBytes("utf-8"));
}
};
mc.add(jsonConverter);
mc.add(new FormHttpMessageConverter());
mc.add(new BufferedImageHttpMessageConverter());
mc.add(new ByteArrayHttpMessageConverter());
mc.add(new StringHttpMessageConverter());
mc.add(new ResourceHttpMessageConverter());
}
public static CloseableHttpClient createHttpClient(){
HttpClientBuilder b = HttpClientBuilder.create();
SSLContext sslContext = null;
try{
sslContext = new SSLContextBuilder().loadTrustMaterial(null,new TrustStrategy(){
public boolean isTrusted(X509Certificate[] arg0,String arg1) throws CertificateException{
return true;
}
}).build();
}catch(Exception e){
e.printStackTrace();
return null;
}
b.setSSLContext(sslContext);
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext,hostnameVerifier);
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
.register("http",PlainConnectionSocketFactory.getSocketFactory()).register("https",sslSocketFactory).build();
PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
connMgr.setMaxTotal(1000);
connMgr.setDefaultMaxPerRoute(500);
b.setConnectionManager(connMgr);
CloseableHttpClient client = b.build();
return client;
}
}
主要关注createHttpClient方法