項目場景:
使用RestTemplate來訪問第三方https接口,接口類型為POST,返回數(shù)據(jù)為JSON,需要忽略https證書,因此對RestTemplate 進行配置,通過HttpClient的請求工廠(HttpComponentsClientHttpRequestFactory)進行構(gòu)建。HttpComponentsClientHttpRequestFactory使用一個信任所有站點的HttpClient就可以解決問題了。
問題描述
中間踩坑:
報錯內(nèi)容:
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] 和內(nèi)容類型 [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.創(chuàng)建一個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 消息轉(zhuǎn)換器
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.創(chuàng)建一個RestTemplateConfig類代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-534102.html
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.調(diào)用代碼,單元測試 MultiValueMap,LinkedMultiValueMap別改 否則參數(shù)會傳輸失敗文章來源地址http://www.zghlxwxcb.cn/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"));
//設(shè)置為表單提交,按需求加
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);
}
}
到了這里,關(guān)于SpringBoot 使用RestTemplate來調(diào)用https接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!