微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java 11 HttpClient 握手失败

如何解决Java 11 HttpClient 握手失败

我在使用 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
免责声明:该库由我编写

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?