问题:
接口请求头传token值的字段为tokenValue,需要用到token的接口一直不能成功请求。
后端排查发现没有接收到token,前端虽然传了token值,但是发现浏览器把tokenValue
变成了Tokenvalue
,导致后端没正确接收到token值。
原因是:
HTTP RFC 里规定,大小写不敏感。
HTTP/1.x 大小写不敏感,但现实是需要做到敏感的。
现在有的服务逐步在开启HTTP/2了,HTTP/2 和 HTTP/1.x 同样使用 ASCII 字符集,但 HTTP/2 头部必须使用小写,而不像 HTTP/1.x 大小写均可。
解决方案:
服务端在接收的时候,都做一下大小写转换,做下兼容处理,避免一些因不规范导致的问题出现。
总结:
对于任意网络协议,客户端在上层跟踪数据包有一定难度,所以先用抓包工具辅助是很好的习惯。
尽管各种协议更新演进,如果前端(业务代码、依赖库版本)或后端任意一方出现协议不兼容或实现不严谨,排查问题难度较高,所以应尽可能做到细致严谨。
对客户端来说,把所有HTTP的Header键字符串转换为小写,业务匹配时也用小写键名称(即equalsIgnoreCase)可同时适配 HTTP/2 和 HTTP/1.x。注意,如果转小写后出现多个相同Header,必须要求服务端修正,同时前端调整代码。
参考:
https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2
https://www.ietf.org/rfc/rfc2616.txt