弹簧休息控制器 - 相同标题的不同值

时间:2021-01-08 14:09:41

标签: java spring spring-restcontroller spring-rest

我有一个 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 ...;
}

2 个答案:

答案 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 指定,用于告诉标准媒体类型除了自定义的。