问题描述
我在使用 Java 11 HTTPClient 从某些 HTTPS 站点检索内容时遇到问题。这是我正在使用的代码:
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://en.wikipedia.org/wiki/Main_Page"))
.build();
HttpResponse<byte[]> response = client.send(request,HttpResponse.BodyHandlers.ofByteArray());
System.out.println(response.statusCode());
System.out.println(new String(response.body()));
java.io.IOException: Received fatal alert: handshake_failure
如果我使用相同的代码但将源 URL 更改为 https://www.google.com
,则它可以正常工作。从一些谷歌搜索来看,这让我觉得这可能是不同加密算法的问题(虽然我不知道),但我不清楚如何解决它。我尝试了一些针对其他 StackOverflow 问题提出的解决方案,但没有找到适合我的解决方案或调试问题的可靠指南。
有人可以指出我可以尝试解决问题的方向吗?
$ java -version
openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04,mixed mode,sharing)
解决方法
我不知道是什么导致了您的环境出现问题,但只是为了测试 URL,我使用 Java 8 运行了不同的 Http 客户端,并且运行良好。以防万一你想试试这个 Http 客户端这里是获取客户端的代码和信息:
private static void testHttpClient() {
HttpClient client = new HttpClient();
client.setConnectionUrl("https://en.wikipedia.org/wiki/Main_Page");
String result;
try {
ByteBuffer buff = client.sendHttpRequestForBinaryResponse(HttpMethod.GET);
result = new String(buff.array());
// result = client.sendHttpRequest(HttpMethod.GET);
System.out.println(result);
} catch (IOException e) {
result = TextUtils.getStacktrace(e,"com.mot.");
}
}
此代码适用于两个选项:您可以注释这两行
ByteBuffer buff = client.sendHttpRequestForBinaryResponse(HttpMethod.GET);
result = new String(buff.array());
并取消注释该行
// result = client.sendHttpRequest(HttpMethod.GET);
它也有效。
这里使用的 HttpClient 来自 MgntUtils 开源库。该库可作为 Maven Artifacts Maven Central here 以及 GitHub(包括源代码和 Javadoc)使用。可以看到该库的 Javadoc here。
免责声明:该库由我编写