如何按照101响应代码读取正文?

时间:2019-09-30 14:48:59

标签: java http apache-httpclient-4.x okhttp

docs

  

在发送101之后      (交换协议)响应,服务器有望继续      响应原始请求,就好像收到了它的请求一样      新协议中的等效项(即服务器仍具有      更改协议后未满足的要求,      并希望这样做而无需要求      重复)。

     

如果在GET请求中收到了Upgrade标头字段      并且服务器决定切换协议,它首先以      HTTP / 1.1中的101(交换协议)消息,然后立即      随之而来的是,新协议等效于对      获取目标资源。这样可以升级连接      协议具有与HTTP相同的语义,而无需等待时间      额外的往返行程。

我已经按如下方式制作了拦截器(使用OkHttp)

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.
    }
    upgradeResponse.body(); // returns null
    // I am clueless on how to read the response hereafter.
    // As per the docs, the 101 status code reply will be followed by a data stream. How can I access this?
    return upgradeResponse;

}

}

基本上,对于单个请求。如果升级成功,我将首先收到101作为响应,然后按照升级后的协议(如果我的理解是正确的?),然后收到另一个响应。无论如何,可以使用OkHttp实现此目的吗?或者,任何其他客户也将有所帮助。

谢谢!

0 个答案:

没有答案