Spring MVC控制器版本控制



我有一个带有Spring MVC控制器的Spring Boot应用程序。我正在尝试使用Accept标头来启动我的REST API。

以下是我的控制器的样子

RestController
@RequestMapping(value = "/private/")
public class AppleController {
  private final AppleService appleService;
  public AppleController(AppleService appleService) {
    this.appleService = appleService;
  }
  @GetMapping(value = "apples/{id}", produces = "application/json; v=1.0",
      headers = "Accept=application/json; v=1.0")
  public ResponseEntity getByappleId(@PathVariable("id") Long appleId) {
    System.out.println("version1");
    GetByappleIdResponse response = appleService.findByappleId(appleId);
    return new ResponseEntity<>(response, HttpStatus.OK);
  }

  @GetMapping(value = "apples/{id}", produces = "application/json; v=2.0",
      headers = "Accept=application/json; v=2.0")
  public ResponseEntity getByappleId2(@PathVariable("id") Long appleId) {
    System.out.println("version2");
    GetByappleIdResponse response = appleService.findByappleId2(appleId);
    return new ResponseEntity<>(response, HttpStatus.OK);
  }

否则我在调用API总是" getByAppleID"方法时传递的版本,因此只返回版本1响应。

我的控制器中有什么问题?

有许多选择可以实现REST API的版本操作:

  • 在评论方法中建议手动路由您的请求;
  • 将版本作为接受标题值的一部分,F.E。:

    (headers = "Accept=application/vnd.name.v1+json")

    (headers = "Accept=application/vnd.name.v2+json")

  • 将版本作为映射的一部分:

    @GetMapping("apples/v1/{id})"

    @GetMapping("apples/v2/{id})

因此,您需要决定要走哪种方式。一些有用的链接:

  • 版本控制REST API
  • API版本的最佳实践?

如下所述:https://stackoverflow.com/a/344427044/258813(并在评论中提到(Spring不支持使用类似标题的路由。p>如果您想通过版本标头支持路由,我建议您进行自定义路由条件和注释 - 当然,如果您要构建大型API,它将导致更少的代码和更优雅的解决方案。

您将定义一些注释,例如@ApiVersion(1),您可以将其添加到也是请求映射的任何方法中,然后添加自定义路由条件,并且会正确行为。

我已经使用自定义路由条件和注释描述了(基于子域 - 但可以很容易地切换到检查标头(:custom-routing-conditions.html

最新更新