我有一个 Spring REST 控制器和两个具有相同值的独立 GetMappings,但每个都接受相同标头的不同标头值(即,一个用于 v1 的 GET 方法和用于 v2 的一个 GET 方法)。
@GetMapping(value = "/{id}", headers = { "Accept-version=v1"})
public UserV1 findByIdV1(@PathVariable long id) {
return ...;
}
@GetMapping(value = "/{id}", headers = { "Accept-version=v2"})
public UserV1 findByIdV2(@PathVariable long id) {
return ...;
}
如果实现不会从一个版本更改为另一个版本,有一个可以接受任一标头值的方法的最佳方法是什么?
理想情况下,该解决方案将允许我针对具有不同实现的不同版本使用不同的方法,以便能够使用 OpenAPI 正确记录这些方法。类似于以下内容:
@GetMapping(value = "/{id}", headers = { "Accept-version=v1 OR Accept-version=v2"})
public UserV1 findByIdV1(@PathVariable long id) {
return ...;
}
// Different response, thus need different method to be able to document this.
@GetMapping(value = "/{id}", headers = { "Accept-version=v3"})
public UserV3 findByIdV2(@PathVariable long id) {
return ...;
}
答案 0 :(得分:1)
可以使用@RequestHeader
将方法内部的头信息作为参数传递:
@GetMapping(value = "/{id}")
public UserV1 findByIdV2(
@PathVariable long id,
@RequestHeader("Accept-version") String acceptVersion
) {
// make a decision based on acceptVersion
return ...;
}
答案 1 :(得分:0)
您可以通过 Accept
标题来实现。
一个很好的例子是 Github API:https://docs.github.com/en/free-pro-team@latest/rest/overview/media-types
Spring 实现:
@GetMapping(value = "/{id}", headers = {"Accept=application/vnd.api.v1+json", "Accept=application/vnd.api.v2+json"})
public UserV1 findByIdV1(@PathVariable long id) {
return ...;
}
@GetMapping(value = "/{id}", headers = "Accept=application/vnd.api.v3+json")
public UserV3 findByIdV2(@PathVariable long id) {
return ...;
}
注意:您可以更改自己域名的 api
部分,vnd.
部分由 rfc4288-3.2 指定,用于告诉标准媒体类型除了自定义的。