如何从java执行https GET请求
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26393031/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to execute a https GET request from java
提问by Luixv
I wrote a Java client which executes http
GET requests without any problem.
Now I want to modify this client in order to execute https
GET requests.
我写了一个 Java 客户端,它可以http
毫无问题地执行GET 请求。现在我想修改这个客户端以执行https
GET 请求。
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
private String executeGet(final String url, String proxy, int port)
throws IOException, RequestUnsuccesfulException, InvalidParameterException {
CloseableHttpClient httpclient = null;
String ret = "";
RequestConfig config;
try {
String hostname = extractHostname(url);
logger.info("Hostname {}", hostname);
HttpHost target = new HttpHost(hostname, 80, null);
HttpHost myProxy = new HttpHost(proxy, port, "http");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
AuthScope.ANY,
new UsernamePasswordCredentials(USERNAME, PASSWORD));
httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
config = RequestConfig.custom().setProxy(myProxy).build();
HttpGet request = new HttpGet(url);
request.setConfig(config);
CloseableHttpResponse response = httpclient.execute(target, request);
...
I was expecting an easy modification like using HttpsGet
instead of HttpGet
but no, there is no HttpsGet
class available.
我期待一个简单的修改,比如使用HttpsGet
而不是HttpGet
但不,没有HttpsGet
可用的类。
What is the easiest way to modify this method in order to handle https
GET requests?
修改此方法以处理https
GET 请求的最简单方法是什么?
采纳答案by Luixv
I developed a solution which looks easier that what has been posted here
我开发了一个看起来比这里发布的更容易的解决方案
private String executeGet(final String https_url, final String proxyName, final int port) {
String ret = "";
URL url;
try {
HttpsURLConnection con;
url = new URL(https_url);
if (proxyName.isEmpty()) {
con = (HttpsURLConnection) url.openConnection();
} else {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyName, port));
con = (HttpsURLConnection) url.openConnection(proxy);
Authenticator authenticator = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return (new PasswordAuthentication(USERNAME, PASSWORD.toCharArray()));
}
};
Authenticator.setDefault(authenticator);
}
ret = getContent(con);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
回答by Leo
this is my quick and dirty https client in Java, that ignores invalid certificates and authenticates using BASIC
这是我用 Java 编写的快速而肮脏的 https 客户端,它会忽略无效的证书并使用 BASIC 进行身份验证
import java.io.IOException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
public static HttpsURLConnection getConnection(boolean ignoreInvalidCertificate, String user, String pass, HttpRequestMethod httpRequestMethod, URL url) throws KeyManagementException, NoSuchAlgorithmException, IOException{
SSLContext ctx = SSLContext.getInstance("TLS");
if (ignoreInvalidCertificate){
ctx.init(null, new TrustManager[] { new InvalidCertificateTrustManager() }, null);
}
SSLContext.setDefault(ctx);
String authStr = user+":"+pass;
String authEncoded = Base64.encodeBytes(authStr.getBytes());
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setRequestProperty("Authorization", "Basic " + authEncoded);
if (ignoreInvalidCertificate){
connection.setHostnameVerifier(new InvalidCertificateHostVerifier());
}
return connection;
}
--
——
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
public class InvalidCertificateHostVerifier implements HostnameVerifier{
@Override
public boolean verify(String paramString, SSLSession paramSSLSession) {
return true;
}
}
--
——
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* ignore invalid Https certificate from OPAM
* <p>see http://javaskeleton.blogspot.com.br/2011/01/avoiding-sunsecurityvalidatorvalidatore.html
*/
public class InvalidCertificateTrustManager implements X509TrustManager{
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) throws CertificateException {
}
}
maybe it's something you can start with.
也许这是你可以开始的东西。
of course, since you have the connection, you can retrieve the response contents using
当然,既然你有连接,你可以使用检索响应内容
InputStream content = (InputStream) connection.getInputStream();