Spring Framework 7 给 @RequestMapping 加了 version 属性,"1.2+" 看起来应该接住 1.9,为什么实测还是 400?不带版本头、版本不在 supported 里、换策略之后分别是什么报错?这篇在 Spring Boot 4.0.8 上逐个请求。
带 1.0:200 v1.0 方法
带 1.1:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '1.1.0'."
带 1.2:200 v1.2+ 方法
带 1.9:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '1.9.0'."
带 2.0:200 v2.0 方法
带 3.0:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '3.0.0'."
带 abc:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: 'abc'."
不带版本头:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.MissingApiVersionException: 400 BAD_REQUEST "API version is required."
访问没写 version 的 /plain,带 2.0:200 没写 version 的方法
访问没写 version 的 /plain,不带:400 {"status":400,"error":"Bad Request","path":"/plain"} ← /plain …accept.MissingApiVersionException: 400 BAD_REQUEST "API version is required."1.0、1.2、2.0 命中,1.1、1.9、3.0、abc 与不带版本头都是 400;配了策略,没写 version 的 /plain 不带版本头也是 400。
带 1.0:200 v1.0 方法
带 1.1(不在 supported 列表里):400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '1.1.0'."
带 1.2:200 v1.2+ 方法
带 1.9:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '1.9.0'."
带 3.0:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '3.0.0'."
不带版本头:200 v1.0 方法default=1.0 让不带版本头的请求命中 1.0 方法;supported 的内容与自动收集的相同时,结果不变。
带 1.1:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.NotAcceptableApiVersionException: 400 BAD_REQUEST "Invalid API version: '1.1.0'."
带 1.9:200 v1.2+ 方法
带 3.0:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.NotAcceptableApiVersionException: 400 BAD_REQUEST "Invalid API version: '3.0.0'."补上 1.9 后命中 1.2+ 方法;1.1 与 3.0 变成 NotAcceptableApiVersionException。
带 1.0:200 v1.0 方法
带 1.1:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '1.1.0'."
带 3.0:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '3.0.0'."
不带版本头:200 v2.0 方法不带版本头也是 200,命中 v2.0 方法,原因没有深究。
/hello?v=2.0:200 v2.0 方法
/hello?v=1.2:200 v1.2+ 方法
/hello 不带参数:400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.MissingApiVersionException: 400 BAD_REQUEST "API version is required."
header 带 2.0(策略已不是 header):400 {"status":400,"error":"Bad Request","path":"/hello"} ← /hello …accept.MissingApiVersionException: 400 BAD_REQUEST "API version is required."换策略后请求头被忽略,不带参数是 400。
/api/1.0/hello:200 v1.0 方法
/api/2.0/hello:200 v2.0 方法
/api/3.0/hello:400 {"status":400,"error":"Bad Request","path":"/api/3.0/hello"} ← /api/3.0/hello …accept.InvalidApiVersionException: 400 BAD_REQUEST "Invalid API version: '3.0.0'."
/api/v2/hello:200 v2.0 方法/api/{version}/hello,/api/v2/hello 命中 v2.0 方法。