跳到主要内容

记录一次由于Http协议版本不一致导致Header请求头未正确解析的问题

· 阅读需 2 分钟
JovenKing

问题回溯

在和某第三方系统进行接口对接时,第三方系统接口要求使用Header传值以便进行权限验证,本地使用OkHttp3客户端进行编码调试,在调试过程中发现通过Header传递的值对方服务器一直提示未获取到。Debug记录如下:

okhttp-http2-header

经过排查,发现编码并未存在问题。

后使用Postman调试,发现通过Postman可以正常请求。 okhttp-http2-header 经过对比,请求参数等条件都一致,唯有Http协议版本不同,由此推测是否是由于Http协议版本不一致导致出现的此问题。

深究原因

Are HTTP headers case-sensitive?

HTTP/1.1HTTP/2标头名称都不区分大小写,但HTTP/2强制执行小写标头名称。也就说在使用HTTP/2协议发送数据时目标服务器会先把Header值中的Name变成小写,然后交给后续程序进行处理,而第三方系统也未考虑这种情况,代码区分大小写取值,这也就导致了上述接口调用失败。

解决方法

针对上述问题,需要指定OkHttp使用HTTP/1.1版本的协议,代码如下

//在构建客户端时强制使用HTTP/1.1进行请求
List<Protocol> protocols = new ArrayList<>();
protocols.add(Protocol.HTTP_1_1);

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

修改完成后重新测试,问题解决。