网关按契约校验请求体,上游在 payload 里加了个 trace_id,线上立刻出现 400,错误信息是 additionalProperties 'trace_id' not allowed。上游说只是加了个可选字段。日志里能对上时间点,这种反而好排。

additionalProperties 为 false 时,schema 里没列出的键一律算非法,和字段是否可选无关。校验发生在业务代码之前,新字段还没被读到就被拦下了。这一点先确认清楚,后面就不用反复试。

{"type":"object","properties":{"order_id":{"type":"string"}},
 "additionalProperties": false}

「JSON Schema 严格模式」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。

处理上按这个顺序:先确认这个字段是不是真的需要透传 不需要就让上游去掉;需要的话在 schema 的 properties 里补上定义 类型和是否必填写清楚;把 additionalProperties 放宽 只拦关键字段 或者用 unevaluatedProperties 控制;回归时拿线上真实报文跑一遍校验 别只用手写样例。

结果对不对很好判断,上游带 trace_id 的报文返回 200 校验日志里不再出现 additionalProperties 报错。

作者 9823189