springboot使用RestTemplate

该博客介绍了如何在Spring中配置RestTemplate以处理HTTP和HTTPS请求,包括创建Bean、设置连接池、重试机制以及忽略SSL证书验证。示例展示了如何在RestTemplate中进行POST和GET请求,同时处理请求头。

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;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值