okHttp拦截器中的协议升级机制

Posted

技术标签:

【中文标题】okHttp拦截器中的协议升级机制【英文标题】:Protocol Upgrade Mechanism in okHttp Interceptors 【发布时间】:2020-01-29 11:11:34 【问题描述】:

我需要将我的请求从 HTTP1.1 服务升级到 HTTP/2。 到目前为止,这是我尝试过的。

public class H2cUpgradeRequestInterceptor implements Interceptor 
    private static final Log logger = LogFactory.getLog(H2cUpgradeRequestInterceptor.class);

    @Override
    public Response intercept(Chain chain) throws IOException 
        Request request = chain.request();
        Request upgradeRequest = request.newBuilder().addHeader("Connection", "Upgrade, HTTP2-Settings")
                .addHeader("Upgrade", "h2c").addHeader("HTTP2-Settings", "AAMAAABkAARAAAAAAAIAAAAA").build();
        Response upgradeResponse = chain.proceed(upgradeRequest);
        if (upgradeResponse != null && upgradeResponse.code() == HttpStatus.SC_SWITCHING_PROTOCOLS) 
            logger.debug("Switching Protocols success"); // Success. Got 101 in reply.
        
        Response response = chain.proceed(request);
        if (response.protocol() == Protocol.HTTP_2)  // This is returning HTTP1.1 as protocol
            logger.debug("Used upgraded h2c protocol");
        
        return response;

    


我的服务器启用了 h2c。在我的第一个chain.proceed() 电话中,我还收到了 101 个交换协议。但是即使切换协议成功,下一个proceed() 总是给我 HTTP1.1 作为协议。实现协议升级的正确方法是正确的吗?如果是的话,如何确保在切换协议成功后使用HTTP2?

【问题讨论】:

【参考方案1】:

根据docs,从此关闭

我不需要再次发送请求。

如果在 GET 请求中收到 Upgrade 标头字段并且 服务器决定切换协议,它首先响应 101 HTTP/1.1 中的(交换协议)消息,然后紧随其后 新协议相当于对 GET 的响应 目标资源。这允许将连接升级到协议 具有与 HTTP 相同的语义,没有延迟成本 额外的往返。

关注here

【讨论】:

以上是关于okHttp拦截器中的协议升级机制的主要内容,如果未能解决你的问题,请参考以下文章

Okhttp3 设计思想学习

Okhttp3 设计思想学习

OkHttp拦截器的实现原理

OkHttp3 拦截器源码分析

OkHttp 3.x 源码解析之Interceptor 拦截器

多部分中的okhttp登录拦截器