1、创建RestTemplate的Bean交给Spring管理(http和https都可以使用)
package com.asiainfo.layout.bboss.restTemplate;
import org.apache.http.client.HttpClient;
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.*;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.ssl.TrustStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
/**
* @author wang.ce
* @version 1.0
* @date 2021/7/9 15:04
*/
@Configuration
public class RestTemplateConfig {
// @Bean
// public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
// return new RestTemplate(factory);
// }
// @Bean
// public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
// HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
// factory.setConnectTimeout(3000);
// factory.setReadTimeout(5000);
// return factory;
// }
@Bean
public RestTemplate restTemplate() {
try {
return new RestTemplate(generateHttpRequestFactory());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
}
return null;
}
public HttpComponentsClientHttpRequestFactory generateHttpRequestFactory()
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException {
TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
new NoopHostnameVerifier());
HttpClientBuilder httpClientBuilder = HttpClients.custom();
httpClientBuilder.setSSLSocketFactory(connectionSocketFactory);
//采用绕过验证的方式处理https请求
// SSLContext sslcontext = createIgnoreVerifySSL();
RegistryBuilder<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.create();
socketFactoryRegistry.register("http", PlainConnectionSocketFactory.INSTANCE)
.register("https", new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()))
.build();
//连接池
PoolingHttpClientConnectionManager httpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry.build());
httpClientConnectionManager.setMaxTotal(2);
httpClientConnectionManager.setDefaultMaxPerRoute(20);
//region 重试机制 retryHandler
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(2, true);
HttpClient httpClient = HttpClientBuilder.create()
.setRetryHandler(retryHandler)
.setConnectionManager(httpClientConnectionManager)
//默认客户端连接重用策略
.setConnectionReuseStrategy(new DefaultClientConnectionReuseStrategy())
//保持长连接配置,需要在头添加Keep-Alive
.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy())
.setConnectionManagerShared(true)
.build();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
//连接超时时间
factory.setConnectTimeout(2000);
//读取超时时间
factory.setReadTimeout(30000);
factory.setHttpClient(httpClient);
////endregion
return factory;
}
/**
* 忽略Http证书验证方式
* @return
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSLv3");
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] paramArrayOfX509Certificate,
String paramString) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sc.init(null, new TrustManager[]{trustManager}, null);
return sc;
}
}
2、使用restTemplate
@Autowired
private RestTemplate restTemplate;
private RetMsg post(UserVo user) {
RetMsg resp = new RetMsg();
String apiName = "login";
String irmsFullUrl = irmsUrl + apiName ;
try {
//修改头信息的Post请求
HttpHeaders headers = new HttpHeaders();
headers.add(ConstantsKey.ACCESS_TOKEN,"123");
HttpEntity requestEntity = new HttpEntity<String>(headers);
resp = restTemplate.postForObject(irmsFullUrl,requestEntity,RetMsg.class,user);
logger.info("请求响应:"+JsonUtil.toString(resp));
}catch (Exception e){
logger.error("登陆错误",e.getMessage());
resp.setCode(1);
resp.setMessage("无法访问服务:" + apiName);
}
return resp;
}
/**
* 不修改请求头的get请求
* @param refreshToken
* @return
*/
private RetMsg get(String userName) {
RetMsg resp = new RetMsg();
String apiName = "login";
String irmsFullUrl = irmsUrl + apiName+"/{userName}" ;
try {
RetMsg result = restTemplate.getForObject(irmsUrl, RetMsg.class, userName);
logger.info("请求响应:"+JsonUtil.toString(resp));
}catch (Exception e){
logger.error("登陆错误",e.getMessage());
resp.setCode(1);
resp.setMessage("无法访问服务:" + apiName);
}
return resp;
}
/**
* 修改请求头的get请求
* @param refreshToken
* @return
*/
private RetMsg get(String userName) {
RetMsg resp = new RetMsg();
String apiName = "login";
String irmsFullUrl = irmsUrl + apiName ;
try {
HttpHeaders headers = new HttpHeaders();
headers.add(ConstantsKey.ACCESS_TOKEN,"123");
HttpEntity requestEntity = new HttpEntity<String>(headers);
ResponseEntity<RetMsg> result = restTemplate.exchange(irmsUrl, HttpMethod.GET, requestEntity, RetMsg.class);
logger.info("请求响应:"+JsonUtil.toString(resp));
}catch (Exception e){
logger.error("登陆错误",e.getMessage());
resp.setCode(1);
resp.setMessage("无法访问服务:" + apiName);
}
return resp;
}
该博客介绍了如何在Spring中配置RestTemplate以处理HTTP和HTTPS请求,包括创建Bean、设置连接池、重试机制以及忽略SSL证书验证。示例展示了如何在RestTemplate中进行POST和GET请求,同时处理请求头。


被折叠的 条评论
为什么被折叠?



