【问题标题】:Is there a standard way to define CURIEs in HTTP header fields?是否有在 HTTP 标头字段中定义 CURIE 的标准方法?
【发布时间】:2016-11-13 11:26:44
【问题描述】:

最近在设计一个RESTful API,想用Link这个头域来实现HATEOAS。

这一切都很好,没有任何实际问题,但我想让 API 的客户更容易。

例如,Link 标头可能如下所示:

Link: <https://api.domain.com/orders/{id}>; rel="https://docs.domain.com/order"

在这种情况下,客户端必须通过搜索 rel 属性中的 https://docs.domain.com/order 值来找到链接。

这可行,但由于文档的 URI 可能会更改,因此它很脆弱,并且由于长度的原因,它使其作为搜索键有点不切实际。

所以我想尝试使用 CURIE 来代替:

Link: <https://api.domain.com/orders/{id}>; rel="[rc:order]"

这样,URI 更改的问题在很大程度上得到缓解,而且更加紧凑,允许客户端更轻松地进行搜索。

我的问题是,由于我使用 Link 标头字段来实现 HATEOAS,我觉得将 CURIE 作为 HTTP 标头字段也包含在内是最一致的,而不是在响应正文中引入元数据。

由于整个 API 对所有元数据(分页、版本控制等)使用标准 HTTP 标头字段和状态代码,我宁愿不将元数据引入响应正文来定义 CURIE。

但是如果我使用 HTTP 标头字段,我应该将哪个字段用于 CURIE?

是否有标准的方法来处理 HTTP 标头字段?

如果没有,我是否应该只使用自定义标题字段,例如 X-Curie: <https://docs.domain.com>; name="rc",然后将其记录在某个地方供客户使用?

我环顾四周,大多数资源都参考 XML 或 HAL 标准,因此任何与 HTTP 标头字段相关的信息都将不胜感激。

【问题讨论】:

    标签: rest http http-headers api-design hateoas


    【解决方案1】:

    不,你不能那样做。链接关系是一个字符串 - 仅此而已。

    您应该问自己的问题是,为什么您首先要使用不稳定的链接关系名称...

    【讨论】:

    • 因为这是网络链接 RFC 所要求的。它声明:“不希望注册关系类型的应用程序可以使用扩展关系类型,这是一个唯一标识关系类型的 URI [RFC3986]”然后它说:“当比较扩展关系类型时,它们必须作为字符串进行比较(如果以不同的格式序列化,则在转换为 URI 之后,例如居里 [W3C.CR-curie-20090116])”。所以需要一个 URI 并且允许一个 CURIE,我只是想知道是否有定义 CURIE 的标准方法。这并不意味着 URI 肯定不稳定,但 CURIE 更好。
    • 至少这是我对 RFC 的理解。当然,我没有必须使用 CURIE,我只是想是否有一种标准方法可以在 HTTP 标头字段中定义 CURIE,这会使客户端的事情变得更好。
    • @JakeLucas - 你误解了那部分;它是关于以 HTTP 标头字段以外的其他格式出现的链接关系。
    • 我一直在重新阅读 RFC,但无法理解其中的某些部分。所以我猜你说的是在 HTTP 标头字段中不可能有像 CURIE 这样的东西,因为它在下面说:“请注意,扩展关系类型必须是链接标头中的绝对 URI”?我没有注意到那部分,所以如果我现在的理解是正确的,这意味着我必须为rel 使用绝对URI,因为它是Link 标头,仅此而已。对吗?
    • 是 - 绝对 URI,或者将它们注册为通用链接关系。
    【解决方案2】:

    即使您不使用Link 标头,CURIE 也无法解决您提出的问题。因为CURIE 的标准状态是在执行任何比较之前必须“解包”缩短的 URI。这也适用于与相关链接关系的比较。

    更实用的方法是创建自己的 URI,例如 foo:order。然后,您可以使用一些自定义 url 缩短方法来解析相关关系的文档 url。这种方法被HAL+JSON 等超媒体格式使用(curies 的 HAL 格式使用实际上具有误导性,它应该只用作将 URL 解析为文档的方法)。

    【讨论】:

      【解决方案3】:

      HTTP Link 标头的 rel 属性中的 CURIE 不会被扩展,因为所有 rel 属性都等同于简单的字符串匹配,没有一个被视为 URI。

      我主要关心的是“因为文档的 URI 可能会改变它是脆弱的”这句话——然后选择一个不会改变的 URI。即使您使用重定向到文档深处某个位置的 URL,如果您希望客户端开发人员能够解析它,您为链接关系选择的 URI 也必须是永久性的。

      【讨论】:

        猜你喜欢
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        相关资源
        最近更新 更多