RestTemplate 调用第三方https接口 SSL认证问题记录

在SpringBoot项目中,当我们调用第三方接口时,一般有HttpClient和框架自带的RestTemplate两种,我下面用的框架自带的restTemplate

 @Bean(name = "customRestTemplate")
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
 
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(15000);//设置连接超时时间
        factory.setReadTimeout(10000);//设置读取超时时间

        restTemplate.setRequestFactory(factory);
        return restTemplate;
    }

通过配置构建一个简单的模板,再在工具类里引用一下就能实现最基本的调用:

	@Resource
    private RestTemplate customRestTemplate;
    
	/**
     * POST请求
     * @param url 请求url
     * @param jsonParams json参数
     * @param headers 自定义请求头参数
     * @param classz 返回类型
     * @return
     */
    public <T> T post(String url, String jsonParams, Map<String, String> headers, Class<T> classz) {
        HttpHeaders headersContent = new HttpHeaders();
        //headersContent.set("Content-Type",headers.get("Content-Type")); 自定义请求头
        HttpEntity<String> entity = new HttpEntity<>(jsonParams, headersContent);

        return customRestTemplate.postForObject(url, entity, classz, "1");
    }

测试代码:

/*
*tyfoRequestUtils——是工具类的名称
*url:请求路径
*paramMap: 请求参数Map
*headers: 自定义请求头(没有的也可以改下上面方法,多加一个方法调用(headers为null)的情况)
*/
String result = tyfoRequestUtils.post(url, paramMap, headers, String.class);

重点:上面的方法在请求https接口时会出现SSL认证问题;也就是

nested exception is javax.net.ssl.SSLHandshakeException: No subject
alternative names matching IP address 192.168.00.00 found

这种错误

这是由于请求https回去认证证书,可以选择添加认证证书(没做过)具体可以去查别人的博客,我这里用的绕过认证请求到数据:

	/**
     * 访问第三方https 绕过/忽略 SSL认证
     *
     * @return  RestTemplate
     * @throws KeyStoreException
     * @throws NoSuchAlgorithmException
     * @throws KeyManagementException
     */
    @Bean(name = "httpsRestTemplate")
    public RestTemplate httpsRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        //配置信赖策略
        TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;

        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();

        // 配置NoopHostnameVerifier.INSTANCE (new NoopHostnameVerifier() 也行)
        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);

        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);
        requestFactory.setConnectTimeout(15000);
        requestFactory.setReadTimeout(10000);

        return new RestTemplate(requestFactory);
    }

工具类

/**
     * 访问第三方https 绕过证书认证
     * Post请求(调用第三方接口——form表单数据)
     * @param url   请求url
     * @param paramMap    参数map
     * @param classz  返回类型(Object、String)
     * @param <T>
     * @return
     */
    public <T> T post(String url, LinkedMultiValueMap<String, String> paramMap, Class<T> classz) {
        HttpHeaders headers = new HttpHeaders();
        //我是用LinkedMultiValueMap提交表单类型数据(可以自己改其他的)
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity<LinkedMultiValueMap<String, String>> entity = new HttpEntity<>(paramMap, headers);

       return httpsRestTemplate.postForObject(url, entity, classz, "1");
    }

调用

		//这是将自己的参数对象转为map
		Map<String, String> entryMap = JSON.parseObject(JSONObject.toJSONString(integralOrderDto), Map.class);
        //提交表单类型数据所以做了转换(不传map可以删掉这些,直接传)
        LinkedMultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
        for (Map.Entry<String, String> map : entryMap.entrySet()) {
            paramMap.add(map.getKey(), map.getValue());
        }
        //调用返回数据(一般返回String、Object)
        Object result = tyfoRequestUtils.post(url, paramMap, Object.class);

通过上面这些配置基本就能直接访问调用https的接口了,但是如果嫌麻烦还可以直接用Hutool的工具

1.在pom文件中引入依赖
		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.17</version>
        </dependency>
2.直接使用
String post = HttpUtil.post(url, JSONObject.toJSONString(integralOrderDto));

用Hutool很方便,直接就能请求,拿到返回的数据自己在转换解析就行。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RestTemplate是一个Java库,用于向RESTful Web服务发送HTTP请求。要使用RestTemplate调用第三方接口,您需要: 1.创建一个RestTemplate对象 2.使用RestTemplate对象发送HTTP请求到第三方接口 3.处理响应,包括解析返回的JSON或XML数据 以下是一个示例代码,用于使用RestTemplate发送GET请求: ``` RestTemplate restTemplate = new RestTemplate(); String url = "https://api.example.com/data"; String response = restTemplate.getForObject(url, String.class); ``` 在上面的代码中,我们创建了一个RestTemplate对象,然后使用getForObject()方法发送了一个GET请求到https://api.example.com/data。最后,我们将响应存储在一个String变量中。您可以使用其他方法来发送POST、PUT、DELETE等不同类型的HTTP请求。请注意,您可能还需要添加一些请求头、身份验证信息等,具体取决于您要调用第三方接口。 ### 回答2: RestTemplate是Spring框架中提供的一个用于访问RESTful风格的HTTP服务的模板类。RestTemplate可以简化HTTP请求的发送和响应的处理。通过调用第三方接口,可以获取第三方服务提供的数据或进行数据的传输。下面将详细介绍RestTemplate调用第三方接口的过程。 首先,在SpringBoot项目中使用RestTemplate,需要在pom.xml中引入spring-boot-starter-web中的相关依赖。 在代码中可以通过创建RestTemplate对象来调用第三方接口RestTemplate提供了多个方法,可以进行GET、POST、PUT、DELETE等HTTP请求。可以通过调用RestTemplate.exchange()方法来发送HTTP请求并获得响应。 在发送HTTP请求时,需要设置请求的URL、请求方法、请求参数、请求头等内容。在接收响应时,需要解析响应,提取需要的信息。 当第三方接口需要传递json格式的数据时,可以通过设置Content-Type为application/json,并将json数据转为字符串传入请求中。 另外,还可以通过配置RestTemplate实例的拦截器来实现对HTTP请求和响应的拦截、修改和重试等操作。例如,在一个项目中可以将请求头的Token值从数据库中获取,然后添加到每个HTTP请求中。 总结来说,使用RestTemplate调用第三方接口的过程包括创建RestTemplate对象、设置请求和响应内容、发送请求并获取响应、解析响应数据等步骤。同时,通过配置RestTemplate的拦截器,可以实现更多的定制化操作。掌握RestTemplate的使用方法,可以更加便捷地实现与第三方系统的集成和交互。 ### 回答3: RestTemplate 是 Spring 提供的一种用于访问 Restful 服务的客户端,它简化了与 HTTP 服务的通信方式,支持多种 HTTP 方法(GET、POST、PUT、DELETE 等),并提供了序列化和反序列化 JSON、XML 等格式数据的功能,是在 Java 开发中经常用到的工具类库之一。 RestTemplate 调用第三方接口时需要先创建 RestTemplate 实例,并指定需要访问的接口的 URL 和请求方法,然后设置请求头和请求体,最后发起请求并得到响应。 创建 RestTemplate 实例可以通过直接 new 的方式,也可以通过在 Spring 配置文件中定义 bean 的方式获取。对于一些需要在多个模块中使用的请求参数,可以定义为一个公共的类,然后在每次发送请求时构造请求参数,以简化开发。此外,还可以通过 RestTemplate 提供的拦截器机制为请求添加统一的请求头、请求参数等信息。 在发送请求时,可以根据请求方法和需要传递的数据类型选择对应的方法。例如,发送 GET 请求可以使用 getForObject 或 getForEntity 方法,POST 请求可以使用 postForObject 或 postForEntity 方法等。这些方法都会返回一个 ResponseEntity 类型的对象,其中包含了响应码、响应头和响应体等信息,可以根据需要进行解析和处理。 对于调用第三方接口时,需要先了解该接口的具体请求和响应格式,然后据此构造请求参数和解析响应结果。通常情况下,需要对接口返回结果进行检查和异常处理,以保证程序的正常运行。 总之,RestTemplate 是一种非常方便的工具类库,可以方便地调用第三方接口,提高开发效率和程序的可靠性。在使用过程中要注意接口请求和响应的格式,保证请求参数和响应结果的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值