【问题标题】:Versioning related media types individually or in lockstep in a RESTful API单独或在 RESTful API 中同步对相关媒体类型进行版本控制
【发布时间】:2021-12-01 08:46:56
【问题描述】:

我正在围绕一个电子商务网站开发一个 REST API,我的资源之一是一个订单,其中包含诸如制造、ID、状态、发货时间等信息。

我已经为我的 Order 资源定义了一个媒体类型,如下所示:

application/vnd.myapp.order.v1+json

我还定义了另一个资源,即订单状态,如下所示:

application/vnd.myapp.order-status.v1+json

我的问题是关于这些媒体类型的版本控制。既然它们是相关的,那么以同步方式对它们进行版本控制是否有意义?例如,如果订单资源的表示发生变化并且我创建了一个application/vnd.myapp.order.v2+json,那么将订单状态媒体类型的版本也提升到 v2 是否明智?我还想知道是否有关于指南的 RESTful 选项。我确实在网上浏览了一下,并没有真正找到任何关于这里最佳实践的内容,因此我们非常感谢任何建议/意见。

【问题讨论】:

    标签: rest media-type


    【解决方案1】:

    我不认为混合版本和媒体类型是个好主意。

    在我看来,你应该按照“分离关注原则”和“单一责任”来区分它。

    https://en.wikipedia.org/wiki/Separation_of_concerns

    https://en.wikipedia.org/wiki/Single-responsibility_principle

    许多团队使用 header/url 进行版本控制: 例如: /api/v1/ /api/v2/ 标头{版本:'v1'} 标头{版本:'v2'}

    然后我们可以轻松地将请求映射到我们的需求:

    @RequestMapping(value="api/v1/books", consumes="application/json")
    @RequestMapping(value="api/v2/books", consumes="application/json")
    

    @RequestMapping(value="api/books",headers="version=v1", consumes="application/json")
    @RequestMapping(value="api/books",headers="version=v2", consumes="application/json")
    

    【讨论】:

    • 您能否详细说明为什么这不是一个好主意?在这种情况下,“不是一个很好的关注点分离”有点模糊而不具体。
    • 我们使用单一职责可能更精确... 1st/ 在软件开发中,我们经常尽量避免混合/嵌合体。第二/可读性/第三少数第三方可能对 application/vnd.myapp.order.v1+json 感到奇怪并感到困惑......
    【解决方案2】:

    虽然它看起来很有用,但它会违反 SoC,并随着 API 的发展而导致其他问题。

    对您的 URL 进行版本控制是更好的选择,因为 URL 是一种完美的方式来表明正在处理的资源类型以及与它处理的数据的关系。 (对我来说,引入自定义标题听起来比自定义版本媒体类型更好)

    自定义媒体类型通常应该告诉消费者数据的类型及其编码方案(例如 xml 与 json 与纯文本等),而不是在编码方案时您的字段在版本之间的排列方式字面上没有变化。

    通过选择此路径,您将:

    1. 强制 API 的使用者与特定的“表示”紧密耦合,这会给双方带来维护问题。
    2. 每当您的 API 的多个“版本”在给定时间共存时 - 当使用 DELETE 或 HEAD 等无实体 https 方法时,它会引入歧义,因为请求信息不足以正确路由您的请求,让完全独立于后端代码。
    3. 它使 rels(链接关系类型)在正常形式下的可用性降低(如果您想介绍它们)

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2012-12-19
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多