JavaSpring:如何向https URL发送http请求?
我必须向一些没有任何参数的API发送GET请求,因此我编写了代码:JavaSpring:如何向https URL发送http请求?,java,spring,rest,ssl,https,Java,Spring,Rest,Ssl,Https,我必须向一些没有任何参数的API发送GET请求,因此我编写了代码: public Boolean getData(String apiUrl) { try { RestTemplate restTemplate = new RestTemplate(); ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.cl
public Boolean getData(String apiUrl) {
try {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
if (responseEntity.getStatusCode().toString().equals("200")) {
theLogger.info("Server successfully answered with response code: {} - {}", responseEntity.getStatusCode().toString(), responseEntity.getBody());
return true;
} else {
theLogger.error("Something goes wrong! Server answered with response code: {} and error: {}", responseEntity.getStatusCode().toString(), responseEntity.getBody());
return false;
}
} catch (Exception theException) {
theException.printStackTrace();
theLogger.error("Cannot send channelInfo! Exception: " + theException);
return false;
}
}
public Boolean getData(字符串apirl){
试一试{
RestTemplate RestTemplate=新RestTemplate();
ResponseEntity ResponseEntity=restTemplate.getForEntity(apiUrl,String.class);
if(responseEntity.getStatusCode().toString().equals(“200”)){
info(“服务器已成功响应,响应代码:{}-{}”,responseEntity.getStatusCode().toString(),responseEntity.getBody());
返回true;
}否则{
logger.error(“出现了问题!服务器用响应代码:{}和错误:{},responseEntity.getStatusCode().toString(),responseEntity.getBody()进行了响应);
返回false;
}
}捕获(异常){
异常。printStackTrace();
logger.error(“无法发送channelInfo!异常:+theException”);
返回false;
}
}
它在API url为HTTP时工作,但不适用于HTTPS。它说:
sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径;嵌套异常为javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径
我相信这是因为我的代码不信任此证书。但我不知道该怎么处理它?API是公共的,它可以在任何web浏览器中打开—它只是一些https站点。我简直不敢相信我应该下载我使用的所有https站点的证书,并将这些证书添加到某个地方。我相信这应该是信任这些公共网站的更普遍的方式。我找到了答案
所以,如果您必须处理由不受信任的CA颁发的证书,但在您的情况下,您并不真正关心信任。您可以通过以下代码禁用SSL证书验证:
import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class SSLCertificateValidation {
public static void disable() {
try {
SSLContext sslc = SSLContext.getInstance("TLS");
TrustManager[] trustManagerArray = { new NullX509TrustManager() };
sslc.init(null, trustManagerArray, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());
} catch(Exception e) {
e.printStackTrace();
}
}
private static class NullX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
System.out.println();
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
System.out.println();
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
private static class NullHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}
在进行HTTPS调用之前调用SSLCertificateValidation.disable()。我找到了答案
所以,如果您必须处理由不受信任的CA颁发的证书,但在您的情况下,您并不真正关心信任。您可以通过以下代码禁用SSL证书验证:
import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class SSLCertificateValidation {
public static void disable() {
try {
SSLContext sslc = SSLContext.getInstance("TLS");
TrustManager[] trustManagerArray = { new NullX509TrustManager() };
sslc.init(null, trustManagerArray, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new NullHostnameVerifier());
} catch(Exception e) {
e.printStackTrace();
}
}
private static class NullX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
System.out.println();
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
System.out.println();
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
private static class NullHostnameVerifier implements HostnameVerifier {
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
}
在进行HTTPS调用之前调用SSLCertificateValidation.disable()