SpringBoot 使用RestTemplate来调用https接口

这篇具有很好参考价值的文章主要介绍了SpringBoot 使用RestTemplate来调用https接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

使用RestTemplate来访问第三方https接口,接口类型为POST,返回数据为JSON,需要忽略https证书,因此对RestTemplate 进行配置,通过HttpClient的请求工厂(HttpComponentsClientHttpRequestFactory)进行构建。HttpComponentsClientHttpRequestFactory使用一个信任所有站点的HttpClient就可以解决问题了。


问题描述

中间踩坑:
报错内容:

no suitable HttpMessageConverter found for response type [class cn.smxy.testSpring.vo.TokenVO] and content type [application/octet-stream]

没有为响应类型 [class cn.smxy.testSpring.vo.TokenVO] 和内容类型 [applicationoctet-stream] 找到合适的 HttpMessageConverter


解决方案:

全局配置中加上
mediaTypes.add(MediaType.APPLICATION_JSON);
mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);

package cn.smxy.testSpring.config;

import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.util.ArrayList;
import java.util.List;

public class HttpMessageConverter extends MappingJackson2HttpMessageConverter {
    public HttpMessageConverter(){
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.TEXT_PLAIN);
        mediaTypes.add(MediaType.TEXT_HTML);
        mediaTypes.add(MediaType.APPLICATION_JSON);
        mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        setSupportedMediaTypes(mediaTypes);
    }
}

完整代码:

配置pom.xml

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.创建一个SSL类代码如下

跳过证书验证,信任所有站点的HttpClient

package cn.smxy.testSpring.util;

import org.springframework.http.client.SimpleClientHttpRequestFactory;

import javax.net.ssl.*;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

/**
 * @author nzh
 * @date 2022/8/22 16:45
 */
public class SSL extends SimpleClientHttpRequestFactory {
    @Override
    protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException {
        if (connection instanceof HttpsURLConnection) {
            prepareHttpsConnection((HttpsURLConnection) connection);
        }
        super.prepareConnection(connection, httpMethod);
    }

    private void prepareHttpsConnection(HttpsURLConnection connection) {
        connection.setHostnameVerifier(new SkipHostnameVerifier());
        try {
            connection.setSSLSocketFactory(createSslSocketFactory());
        } catch (Exception ex) {
            // Ignore
        }
    }

    private SSLSocketFactory createSslSocketFactory() throws Exception {
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new TrustManager[] { new SkipX509TrustManager() }, new SecureRandom());
        return context.getSocketFactory();
    }

    private class SkipHostnameVerifier implements HostnameVerifier {

        @Override
        public boolean verify(String s, SSLSession sslSession) {
            return true;
        }

    }

    private static class SkipX509TrustManager implements X509TrustManager {

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }

        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) {
        }

    }
}

2.自定义HttpMessageConverter类,继承MappingJackson2HttpMessageConverter 消息转换器

package cn.smxy.testSpring.config;

import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.util.ArrayList;
import java.util.List;

public class HttpMessageConverter extends MappingJackson2HttpMessageConverter {
    public HttpMessageConverter(){
        List<MediaType> mediaTypes = new ArrayList<>();
        mediaTypes.add(MediaType.TEXT_PLAIN);
        mediaTypes.add(MediaType.TEXT_HTML);
        mediaTypes.add(MediaType.APPLICATION_JSON);
        mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        setSupportedMediaTypes(mediaTypes);
    }
}

3.创建一个RestTemplateConfig类代码如下:


package cn.smxy.testSpring.config;

import cn.smxy.testSpring.util.SSL;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
 
/**   
 * @ClassName:  RestTemplateConfig   
 * @Description:  RestTemplate配置类
 * @author: nzh
 */
@Configuration
public class RestTemplateConfig {
 
	@Bean
	public RestTemplate restTemplate( ClientHttpRequestFactory factory) {
		RestTemplate restTemplate = new RestTemplate(factory);
		// 支持中文编码
		restTemplate.getMessageConverters().add(new HttpMessageConverter());
		return restTemplate;
	}
 
	@Bean
	public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
		SSL factory = new SSL(); //这里使用刚刚配置的SSL
		// SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
		factory.setReadTimeout(5000);//单位为ms
		factory.setConnectTimeout(5000);//单位为ms
		return factory;
	}
}
 

4.调用代码,单元测试 MultiValueMap,LinkedMultiValueMap别改 否则参数会传输失败文章来源地址https://www.toymoban.com/news/detail-534102.html


@SpringBootTest(classes = TestSpringApplication.class)
@RunWith(SpringRunner.class)

public class SpringApplicationTests {

    @Test
    public void contextLoads() {
        // 请求头信息
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.valueOf("application/x-www-form-urlencoded"));
        //设置为表单提交,按需求加
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        // 组装请求信息
        MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
        //  也支持中文
        params.add("userName", "你的用户名");
        params.add("password", "你的密码");
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
        //VO是接口返回类
        TokenVO tokenVO = restTemplate.postForObject("你的接口地址", requestEntity, TokenVO.class);
        System.out.println(tokenVO);
    }
}

到了这里,关于SpringBoot 使用RestTemplate来调用https接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RestTemplate 请求https接口,无需证书访问,并整合工具类,细到极致

      Hello,大家好呀,我是你们的Jessica老哥,不知不觉,到了3月份了,又是一年一度的金三银四,老哥和大家一样,想换工作,于是呢,更新资料,投简历。试想着把自己的劳动价值卖的更高一点。   没想到,今年好像行情有点不太对劲呀,往年跟HR打个招呼,人家还会要你

    2024年02月08日
    浏览(49)
  • 使用RestTemplate访问https实现SSL请求操作,设置TLS版本

    注意:服务端TLS版本要和客户端工具类中定义的一致, 当支持的是列表时,能够与不同版本的客户端进行通信,在握手期间,TLS会选择两者都支持的最高的版本 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure解决方案 方法升级JDK版本 全局设置优先级 代码里面的设置

    2024年02月01日
    浏览(40)
  • SpringBoot中的RestTemplate使用笔记

    以下代码是基于SpringBoot2.4.2版本写的案例 需要配置的application.yml如下 restTemplate日志拦截器 定义一些API接口 测试使用RestTemplateUtil

    2024年02月15日
    浏览(50)
  • Java工具类:使用RestTemplate请求WebService接口

    对接第三方提供的 WebService 接口,早期的调用方式过于复杂繁琐,所以使用 RestTemplate 进行调用 注:除了 RestTemplate 之外, HttpURLConnection 等也可以用来调用webservice接口 如果需要将xml转为Json,可参考:

    2024年01月22日
    浏览(62)
  • SpringBoot中RestTemplate的使用备忘

    2-1 引入Maven依赖 2-2 创建 RestTemplate 配置类,设置连接池大小、超时时间、重试机制等等。 4-1 使用示例 4-2 参数传递的几种方式 5-1 使用示例 5-2 参数传递的几种方式 6-1 使用示例 6-2 设置 url 参数,同Get请求 7-1 使用示例,和postForObject()基本相似,返回的是ResponseEntity罢了 7-2 设置

    2024年02月02日
    浏览(41)
  • SpringBoot 使用 RestTemplate 发送 binary 数据流

    情况说明: 接口A接受到一个数据流,在postman里的传输方式显示如下: 接口A接受到这个数据流之后,需要转发到接口B进行处理。 这里要注意一点是: postman图中的这种方式和MultipartFile流的传输方式不同,MultipartFile流方式,是在body的form表单中进行传输,需要指定一个key,这

    2024年02月12日
    浏览(41)
  • SpringBoot | RestTemplate异常处理器ErrorHandler使用详解

    关注wx:CodingTechWork   在代码开发过程中,发现很多地方通过 RestTemplate 调用了第三方接口,而第三方接口需要根据某些状态码或者异常进行重试调用,此时,要么在每个调用的地方进行异常捕获,然后重试;要么在封装的 RestTemplate 工具类中进行统一异常捕获和封装。当然

    2024年02月12日
    浏览(44)
  • 【SpringBoot】springboot使用RestTemplate 进行http请求失败自动重试

    我们的服务需要调用别人的接口,由于对方的接口服务不是很稳定,经常超时,于是需要增加一套重试逻辑。这里使用 Spring Retry 的方式来实现。 一、引入POM 二、 修改启动类 在Spring Boot 应用入口启动类,也就是配置类的上面加上 @EnableRetry 注解,表示让重试机制生效。 注意

    2024年02月08日
    浏览(44)
  • restTemplate转发Https请求

    代码架构 效果

    2024年02月08日
    浏览(40)
  • SpringBoot之RestTemplate使用Apache的HttpClient连接池

    SpringBoot自带的RestTemplate是没有使用连接池的,只是SimpleClientHttpRequestFactory实现了ClientHttpRequestFactory、AsyncClientHttpRequestFactory 2个工厂接口,因此每次调用接口都会创建连接和销毁连接,如果是高并发场景下会大大降低性能。因此,我们可以使用Apache的HttpClient连接池。

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包