最近在寫接口的時候給對方回推數據,發送https請求的時候遇到這么個報錯:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetHTTPS經由超文本傳輸協議(HTTP)進行通信,但利用SSL/TLS來加密數據包,這里遇到的問題就是這個安全證書缺少產生的,所以,為了解決這個問題,一般有良好總方法,第一種是將對方網站的證書提前下到本地導入,這里的場景不大適合這個方式,所以采用第二種方式,忽略ssl證書的方法:
具體步驟大致有3步,首先添加一個RestTemplateConfig配置文件,源碼如下:
package com.config;import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
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.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();factory.setConnectTimeout(15000);factory.setReadTimeout(5000);return factory;}public static 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);CloseableHttpClient httpClient = httpClientBuilder.build();HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();factory.setHttpClient(httpClient);return factory;}
}
第二步,修改初始化RestTemplate類:
RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());
第三步便可以將發送信息寫進代碼中發送請求了
RestTemplate restTemplate = new RestTemplate(RestTemplateConfig.generateHttpRequestFactory());MultiValueMap<String, Object> headers = new LinkedMultiValueMap<String, Object>();headers.add("Accept", "*/*");headers.add("Content-Type", "application/json");String requestBody = "{\"returnData\":\"" + str + "\"}";System.out.println(str);HttpEntity entity = new HttpEntity(requestBody, headers);ResponseEntity<String> responseEntity=restTemplate.postForEntity("https://****",entity,String.class);//獲取返回結果String result= responseEntity.getBody();
?工作之余借機記錄一下。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态