从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实现此目的吗?或者,任何其他客户也将有所帮助。
谢谢!