SPDY 不适用于 OkHttp

Posted

技术标签:

【中文标题】SPDY 不适用于 OkHttp【英文标题】:SPDY is not working with OkHttp 【发布时间】:2014-11-10 05:58:53 【问题描述】:

我正在使用带有 OkHttp 2.0.0 的 Retrofit 1.6.1。到目前为止,我们的服务器上还没有启用 SPDY,但昨晚我们已经启用了它。 http://spdycheck.org/ 说我们的服务器上启用了 SPDY,但是当我尝试进行 API 调用时,日志显示使用了 HTTP/1.1:

D/Retrofit(29455): OkHttp-Selected-Protocol: http/1.1

我必须做任何事情来启用带有 OkHttp 的 SPDY 还是应该自动检测到它?

这就是我的设置方式:

OkHttpClient okHttp = new OkHttpClient();

okHttp.setConnectTimeout(15 * 1000, TimeUnit.MILLISECONDS);
okHttp.setReadTimeout(15 * 1000, TimeUnit.MILLISECONDS);
okHttp.setWriteTimeout(15 * 1000, TimeUnit.MILLISECONDS);

OkClient okClient = new OkClient(okHttp);

mRestAdapter = new RestAdapter.Builder()
            .setEndpoint(BASE_URL)
            .setClient(okClient)
            .setConverter(new GsonConverter(mGson))
            .setErrorHandler(errorHandler)
            .setLogLevel(LogLevel.FULL)
            .build();

我正在运行库存 android 4.4.4 的 Nexus 4 和带有库存 ROM 和 Android 4.4.4 的 Moto G 上进行测试

【问题讨论】:

简单问题:基本 URL 是 HTTPS 吗? 是的,基本 URL 是 https 你能分享一下主机名吗? 是的 - youlocalapp.com @JesseWilson 你看了吗? 【参考方案1】:

您使用 okhttp2 和低于 5.0 的 android 设备(不支持 SPDY)的原因,因此该设备从未尝试使用 SPDY 连接。默认情况下它使用http1.1。

如果您的设备 > 5.0 okhttp 将自动选择最新的协议 SPDY 或 HTTP/2。但您不能明确设置/强制它。

注意 - Okhttp3 不支持 SPDY,所以不会尝试建立 SPDY 连接。

【讨论】:

以上是关于SPDY 不适用于 OkHttp的主要内容,如果未能解决你的问题,请参考以下文章

SPDY 与 HAProxy 和 Nginx

SPDY - 没有 TLS?

将 mod-spdy 与 mod-mono 集成

OkHttpOkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 )

OkHttpOkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )

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