【问题标题】:Is there a simple way to solve content negotiation in Spring boot有没有一种简单的方法来解决 Spring boot 中的内容协商
【发布时间】:2015-08-25 11:01:01
【问题描述】:

我们计划使用内容类型协商作为我们的 REST API 的版本控制形式,但它似乎比应有的复杂。 给出以下示例代码:

@RestController
@RequestMapping("/products")
ProductController {
.......
@RequestMapping(value = "/{productID}", method = RequestMethod.GET, produces = "productVersion2/json")
public ResponseEntity<ProductV2> getVersion2(@PathVariable String productID) {
.......
return new ResponseEntity<ProductV2>(product, HttpStatus.OK);

从例如邮递员测试时调用了正确的方法,但我得到一个 HTTP 406 Not Acceptable 作为响应。我一直在寻找几个地方,但我没有找到一个页面来很好地解释我需要做什么才能完成这项工作。

响应将像所有其他请求一样使用 json 解析,但响应对象被修改。 我们的想法是通过这样做,我们可以支持同一个 API 的多个“版本”,并且我们可以逐渐让客户端转移到新的 api,同时仍然可以访问相同的 uri/resource。

谁能指出一个很好的教程或分步指南如何在 spring boot 中解决这个问题?

我已阅读这篇文章:http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc/#combined-controller 但我无法清楚地了解使其工作所需的内容

【问题讨论】:

  • 在通过 Postman 发送的请求中是否有 Accept: productVersion2/json 标头?
  • 是的,我愿意。如前所述,调用被定向到控制器中的正确方法,但是当我尝试返回 new ResponseEntity(product, HttpStatus.OK); 时,它在最后一个方法调用中失败

标签: spring-mvc spring-boot contenttype


【解决方案1】:

您的媒体类型错误。要将自定义媒体类型用于 API 版本控制,您可以使用 application/productVersion2+json 而不是 productVersion2/json。我怀疑你得到了 406,因为 Spring Boot 无法找出如何将你的对象序列化为 JSON,因为 productVersion2/json 不是 json 数据的有效媒体类型。

选择媒体类型的方法不止一种,我在谷歌上搜索了一个更全面的文档here

【讨论】:

  • 非常感谢。它现在可以工作了:) 令人沮丧的是,这么简单的事情可能会阻止我,但我还没有找到很多描述这个问题的资源。顺便说一句,你找到了很棒的文章。与工作中的一群同事分享 :)
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 2011-04-10
  • 2013-06-18
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多