如何在Android设备上使用Okhttp实现http/2?

17

我正在测试一个支持HTTP/2的网站,像这样,并尝试使用okhttp发送请求:

OkHttpClient okHttpClient = new OkHttpClient();

Request request = new Request.Builder()
        .url("https://www.google.it")
        .build();


okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Request request, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Response response) throws IOException {
        Log.d("TestHttp", "OkHttp-Selected-Protocol: " + response.header("OkHttp-Selected-Protocol"));
        Log.d("TestHttp", "Response code is " + response.code());
    }
});

在日志中我得到了类似这样的内容:

OkHttp-Selected-Protocol: http/1.1

okhttpClient选择使用http/1.1,我该如何强制它使用HTTP/2?


我找到了这个链接,看起来OkHttp支持h2-16及更高版本。 - Zack
你是在 Android 设备上运行还是在桌面上?在桌面 JVM 上,你需要 Jetty-ALPN。你可以在这里查看详细信息:https://github.com/square/okhttp/wiki/Building - Jesse Wilson
@JesseWilson 我在 Android 设备上运行此程序。 - Zack
这只是我的一点建议:这里有另一个网站支持HTTP/2,你可以用来进行测试,找到API部分。由于服务器和客户端支持不同的草案,会导致一些不协调。此外,一些服务器选择根据客户端呈现的ALPN列表的顺序选择协议,而其他服务器将使用自己的内部首选项,rfc对两者都没有异议。 - dsign
@JesseWilsion 我使用的是Android 4.4.4。当我在Android 5.0.0上进行测试时,我得到了预期的结果,OkHttp使用http/2协议。这是否意味着我只能在Android 5或更新版本上使用Okhttp发送http/2请求?(对我的糟糕英语表示抱歉...) - Zack
显示剩余3条评论
2个回答

5

Okhttp 2.5+只支持通过ALPN协议使用5.0+以上版本的http/2。

但是,您可以修改源代码以通过NPN协议支持4.0+以上版本的http/2。


4
如何配置ALPN? - Yang Peiyong
1
所以OkHttp 3.9.0+可以直接处理HTTP2,使用由Google Play服务提供的ALPN。 - Aman Alam

1
您只需要正确初始化您的OkHttpClient即可。
Kotlin:
val client = OkHttpClient().newBuilder()
    .protocols(listOf(Protocol.HTTP_2, Protocol.HTTP_1_1))
    .build()

// Your client will now try to use HTTP 2 if possible. If not, then HTTP 1.1 will be used.

Java:

List<Protocol> protocols = new ArrayList<Protocol>();
protocols.add(Protocol.HTTP_2);
protocols.add(Protocol.HTTP_1_1);

OkHttpClient client = new OkHttpClient.Builder()
        .protocols(protocols)
        .build();

// Your client will now try to use HTTP 2 if possible. If not, then HTTP 1.1 will be used.

如果您想检查是否正在使用HTTP 2,请参阅我的其他答案:https://dev59.com/p4vda4cB1Zd3GeqPcKUY#72983159


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接