HTTP/2 使用 OkHttp

HTTP/2 with OkHttp

我正在尝试使用 OkHttp 客户端与 HTTP/2 服务器通信。

添加到 Maven POM:

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>3.2.0</version>
</dependency>    

这是我的测试代码:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("https://http2.akamai.com/demo").build();
Response response = client.newCall(request).execute();
System.out.println("Protocol: " + response.protocol());
System.out.println(response.body().string());

但是当我 运行 它打印时:

Protocol: http/1.1

This browser is not HTTP/2 enabled.

环境:Linux.

上的 OpenJDK 8

您需要额外的东西吗?我看到了一个叫做 "ALPN" 的东西,但不太理解这个概念。

ALPN 是 HTTP/2 所必需的,但它在 Java 桌面版中不可用,直到 JDK 9。在 Java 7 和 Java 8 中你需要一个名为 jetty-alpn 的 hack 来启用它。

(对于 Java 9,平台上有 ALPN,但仅在即将推出的 OkHttp 3.3 中。)

或者,您可以将 conscrypt 与 apache、jetty 或 okhttpclient 一起使用,以在 jdk8 本身中获得 ALPN 支持,

Security.insertProviderAt(Conscrypt.newProvider(), 1);

p.s: 使用 conscrypt-openjdk-uber jar 包含所有依赖项