HTTP/2 与 OkHttp

Posted

技术标签:

【中文标题】HTTP/2 与 OkHttp【英文标题】:HTTP/2 with OkHttp 【发布时间】:2016-09-17 16:58:52 【问题描述】:

我正在尝试使用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());

但是当我运行它时,它会打印:

协议:http/1.1

此浏览器未启用 HTTP/2。

环境:Linux 上的 OpenJDK 8。

您需要额外的东西吗?我看到了一个叫做“ALPN”的东西,但不太明白这个概念。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于HTTP/2 与 OkHttp的主要内容,如果未能解决你的问题,请参考以下文章

OkHttpOkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )

Android 普通okhttpokhttp utils执行 post get请求,文件上传下载请求图片

OkHttpOkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

OkHttpOkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )

OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )

使用OkHttp进行网络同步异步操作