REST API - 如何查询链接发现?

REST API - How to query for links discovery?

假设我有一个 RESTful HATEOAS API,它有 /posts 端点,它列出了带有查询快捷方式 /posts/new 的帖子。如何查询 API 以发现 /posts/new?

我的想法:

1) 查询 /posts 并从 _links 属性获取链接(列出的实体是必要的开销):

GET /posts

{
  "docs": [
    ...
  ]
  "_links": {
    "new": { "rel": "posts", "href": "/posts/new" }
  }
}

2) 在 API 根目录中与资源列表一起提供:

GET /

{
  "resources": {
    "posts": {
      "_links": {
        "self": { "rel": "posts", "href": "/posts" }
        "new": { "rel": "posts", "href": "/posts/new" }
      }
    }
  }
}

3) 我不应该使用 /posts/new 查询,而是使用 /posts 和查询参数。但是,如果我更改我的服务器逻辑,我也必须更改客户端逻辑,这将是服务-客户端耦合。例如:

注意:帖子只是我一般问的一个例子。

好吧,RESTFUL 的全部意义在于使链接与客户端使用的 HTTP 方法相对应,从而使链接发现变得容易。这意味着您的所有链接都将被简单地命名为 /post,唯一会改变的是 htpp 方法和它们采用的参数,您的服务器将使用这些参数来确定客户端所需的实际操作。

这是来自 C# 项目的示例(注意链接都是一样的,唯一的变化是 HTTP_METHOD and/or 传递的参数):

常用 http 方法列表:POST, GET, PUT, DELETE

在 REST 架构中,URI 应该通过它们附带的 link-关系名称来发现。将您上面的示例解释为 HAL the URI /post/new has a link-relation name of new. Link relation names provide semantics to URIs which allow clients to determine when to invoke these URIs. HAL is just one of a handful JSON-based media types that support HATEOAS. There are further media-types 可用,它们提供类似的工作,但语法和功能略有不同。

收到此类文档后,客户端将解析消息并为包含实际内容的消息构建一些上下文,包括 link 等附加元数据和进一步嵌入的数据。如果它想要检索最新帖子的列表,它基本上需要从前面提到的上下文中查找表达意图(new)的键(link-关系名称)为了检索分配的值(URI)。客户端如何维护此上下文是一些实现细节。它可能会建立一个树形图,以便更轻松地查找 "link-relation" 键及其值(URI)或使用一些完全不同的方法。

需要以某种方式提供使用什么密钥的知识。由于 link 关系表达了​​某些语义,因此需要在某处指定它们。这可能发生在行业标准或媒体类型定义中。 IANA 维护一个标准化的 link 关系名称及其语义列表。在检查列表时,根据您的规范,最可能的匹配项是 current,它被定义为

Refers to a resource containing the most recent item(s) in a collection of resources.

因此,我建议将 link-关系名称从 new 更改为 current