1.最近在调用第三方API遇到证书验证问题 postman调用和用RestTemplate分别报错如下:
2.经过查询资料 是https,需要安装证书,但是自定义的证书貌似得不到信任,所以报PKIX path building failed 解决办法分别如下:postman解决方法如下:
3.再次用postman调用 就可以了 :
4.用RestTemplate调用 忽略SSL证书验证即可 代码如下:
public static RestTemplate buildRestTemplate() {
RestTemplate restTemplate = new RestTemplate();
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectionRequestTimeout(300000);
factory.setConnectTimeout(300000);
factory.setReadTimeout(300000);
// https
CloseableHttpClient httpClient = getHttpsClient();
factory.setHttpClient(httpClient);
restTemplate = new RestTemplate(factory);
return restTemplate;
}
public static CloseableHttpClient getHttpsClient() {
CloseableHttpClient httpClient;
SSLContext sslContext = null;
try {
sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
}).build();
} catch (NoSuchAlgorithmException e) {
e.getStackTrace();
} catch (KeyManagementException e) {
e.getStackTrace();
} catch (KeyStoreException e) {
e.getStackTrace();
}
httpClient = HttpClients.custom().setSSLContext(sslContext).
setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
return httpClient;
}
public <T> T post(String url, Object param, Class<T> clazz,RestTemplate restTemplate, Map<String, String> headerMap) {
String value = "";
if (param instanceof String) {
value = (String) param;
} else {
value = JSONObject.toJSONString(param);
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(APPLICATION_JSON_VALUE));
if(headerMap!=null){
for (String key : headerMap.keySet()
) {
headers.add(key, headerMap.get(key));
}
}
HttpEntity<String> requestEntity = new HttpEntity<String>(value,
headers);
ResponseEntity<T> tResponseEntity = restTemplate.postForEntity(
url,
requestEntity, clazz);
return tResponseEntity.getBody();
}
5.用RestTemplate调用post方法 代码如下:
package com.longjin.wechat.controller;
import com.alibaba.fastjson.JSONObject;
import com.longjin.comm.utils.RestTemplateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @Description:
* @Author 何志鹏
* @Date 2020/6/18 16:00
* @Version 1.0
*/
@RestController
@RequestMapping("/api/test")
public class test {
@Autowired
private RestTemplateUtils templateUtils;
@PostMapping("get")
public JSONObject get() {
//条件查询参数
Map<String, Object> map = new HashMap<>();
map.put("pageindex",1);
map.put("pagesize",99999999);
Map<String, String> headerMap = new HashMap<>();
headerMap.put("Authorization","header内容");
JSONObject post = templateUtils.post("调用的第三方url地址", map, JSONObject.class, RestTemplateUtils.buildRestTemplate(),headerMap);
System.err.println( post.size());
return post;
}
}
6.调用结果如下: