SpringBoot系列之RestTemplate调https接口

JAVA烂猪皮

共 5413字,需浏览 11分钟

 ·

2020-12-05 23:46

走过路过不要错过

点击蓝字关注我们


业务:本系统接口都是http的,调用第三方接口,因为做了安全性校验,所以不能通过RestTemplate调用

方法:重写覆盖SimpleClientHttpRequestFactory抽象类的prepareConnection方法

package com.minstone.apprBase.common.utils.http.rest;

import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.TrustStrategy;
import org.springframework.http.client.SimpleClientHttpRequestFactory;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import java.net.HttpURLConnection;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
* 兼容调Https接口
* @Author mazq
* @Date 2020/06/04 17:16
* @Param
* @return
*/

public class HttpsClientRequestFactory extends SimpleClientHttpRequestFactory {

@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) {
try {
if (!(connection instanceof HttpsURLConnection)) {// http协议
//throw new RuntimeException("An instance of HttpsURLConnection is expected");
super.prepareConnection(connection, httpMethod);
}
if (connection instanceof HttpsURLConnection) {// https协议,修改协议版本
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
// 信任任何链接
TrustStrategy anyTrustStrategy = new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
};
SSLContext ctx = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy).build();
((HttpsURLConnection) connection).setSSLSocketFactory(ctx.getSocketFactory());
HttpsURLConnection httpsConnection = (HttpsURLConnection) connection;
super.prepareConnection(httpsConnection, httpMethod);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

关键代码,new RestTemplate(new HttpsClientRequestFactory());,对应工具类参考:

package com.minstone.apprBase.common.utils.http.rest;

import com.minstone.apprBase.common.utils.web.WebUtil;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

/**
*

* RestTemplate 远程调用工具类
*

*
*

* @author mazq
* 修改记录
* 修改后版本: 修改人:修改日期: 2020/06/01 11:38 修改内容:
*

*/

@Component
public class RestTemplateUtils {


public static RestTemplate geTemplate(){
return new RestTemplate(new HttpsClientRequestFactory());
}

/**
* GET请求调用方式
* @Author mazq
* @Date 2020/06/01 13:47
* @Param [url, responseType, uriVariables]
* @return org.springframework.http.ResponseEntity
*/

public static ResponseEntity getForEntity(String url, Class responseType, Map uriVariables) {
return geTemplate().getForEntity(url, responseType, uriVariables);
}

/**
* POST请求调用方式
* @Author mazq
* @Date 2020/06/01 13:47
* @Param [url, headers, body, responseType]
* @return org.springframework.http.ResponseEntity
*/

public static ResponseEntity postForEntity(String url,HttpHeaders headers, Object requestBody , Class responseType ){

HttpEntity requestEntity = new HttpEntity(requestBody, headers);
return geTemplate().postForEntity(url, requestEntity, responseType);
}

/**
* PUT请求调用方式
* @Author mazq
* @Date 2020/06/01 13:35
* @param url 请求URL
* @param headers 请求头参数
* @param requestBody 请求参数体
* @param responseType 返回对象类型
* @param uriVariables URL中的变量,与Map中的key对应
* @return ResponseEntity 响应对象封装类
*/

public static ResponseEntity put(String url, HttpHeaders headers, Object requestBody, Class responseType, Map uriVariables) {
HttpEntity requestEntity = new HttpEntity(requestBody, headers);
return geTemplate().exchange(url, HttpMethod.PUT, requestEntity, responseType, uriVariables);
}

/**
* DELETE请求调用方式
* @Author mazq
* @Date 2020/06/01 13:37
* @param url 请求URL
* @param headers 请求头参数
* @param requestBody 请求参数体
* @param responseType 返回对象类型
* @param uriVariables URL中的变量,按顺序依次对应
* @return ResponseEntity 响应对象封装类
*/

public static ResponseEntity delete(String url, HttpHeaders headers, Object requestBody, Class responseType, Object... uriVariables) {
HttpEntity requestEntity = new HttpEntity(requestBody, headers);
return geTemplate().exchange(url, HttpMethod.DELETE, requestEntity, responseType, uriVariables);
}

/**
* 通用调用方式
* @Author mazq
* @Date 2020/06/01 13:37
* @Param [url, method, requestEntity, responseType, uriVariables]
* @return org.springframework.http.ResponseEntity
*/

public static ResponseEntity exchange(String url, HttpMethod method, HttpEntity requestEntity, Class responseType, Map uriVariables) {
return geTemplate().exchange(url, method, requestEntity, responseType, uriVariables);
}
}




往期精彩推荐



腾讯、阿里、滴滴后台面试题汇总总结 — (含答案)

面试:史上最全多线程面试题 !

最新阿里内推Java后端面试题

JVM难学?那是因为你没认真看完这篇文章


END


关注作者微信公众号 —《JAVA烂猪皮》


了解更多java后端架构知识以及最新面试宝典


你点的每个好看,我都认真当成了


看完本文记得给作者点赞+在看哦~~~大家的支持,是作者源源不断出文的动力


作者:SmileNicky

出处:https://www.cnblogs.com/mzq123/p/13152885.html

浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报