有没有一种标准方法可以在 HTTP header 字段中定义 CURIE?

Is there a standard way to define CURIEs in HTTP header fields?

最近在设计一个RESTfulAPI,想用Linkheader字段实现HATEOAS

这一切都很好,没有任何实际问题,但我想让 API.

的客户更轻松

例如 Link header 可能如下所示:

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

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

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

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

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

这样一来,URI 更改的问题在很大程度上得到了缓解,而且它更加紧凑,便于客户端进行搜索。

我的问题是,由于我使用 Link header 字段来实现 HATEOAS,我认为将 CURIE 也作为 HTTP header 包含在内是最一致的字段,而不是在响应中引入元数据 body.

由于整个 API 使用标准 HTTP header 字段和所有元数据的状态代码(分页、版本控制等),我不想在响应中引入元数据 body 只是为了定义一个 CURIE。

但是如果我使用 HTTP header 字段,我应该为 CURIE 使用哪个字段?

是否有使用 HTTP header 字段执行此操作的标准方法?

如果不是,我是否应该只使用自定义 header 字段,例如 X-Curie: <https://docs.domain.com>; name="rc",并在某处为客户记录下来?

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

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

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

即使您不使用 Link header,CURIE 也无法解决您提出的问题。因为 CURIE 的标准规定在执行任何比较之前,缩短的 URI 必须是 "unwrapped"。这也适用于与所讨论的 link 关系的比较。

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

HTTP Link header 的 rel 属性中的

CURIE 不会展开,因为所有 rel 属性都等同于简单的字符串匹配,none 被视为 URI。

我主要关心的是短语 "since the URI for the docs could change it's fragile" — 然后选择一个不会更改的 URI。即使您使用 URL 重定向到文档深处的某个位置,如果您希望客户端开发人员能够解析它,您为 link 关系选择的 URI 也需要是永久的。