网关升级支持 HTTP/2 后,部分客户端提交表单后端收不到参数,返回参数缺失。日志里能对上时间点,这种反而好排。
请求体长度声明与实际发送不一致,或中间层把分块传输处理错了。这一点先确认清楚,后面就不用反复试。
POST /api/save HTTP/2
content-type: application/json
{"a":1}
# 抓包
curl --http2 -v -d '{"a":1}' https://example.com/api/save
「HTTP2 请求体丢失」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
处理上按这个顺序:统一由框架计算长度;避免手动设置该头;抓包确认请求体完整到达。
结果对不对很好判断,所有客户端提交都能被正确解析,参数缺失问题消失。