【问题标题】:REST API - How to query for links discovery?REST API - 如何查询链接发现?
【发布时间】:2018-11-09 23:48:18
【问题描述】:

假设我有一个 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 和查询参数。但是,如果我更改服务器逻辑,我也必须更改客户端逻辑,这将是服务-客户端耦合。例如:

  • 客户端将通过某种方式提供参数timestamp > (today - 30) 来请求新消息
  • 我介绍了draft 属性并改变了我的想法,即new 只是带有timestamp > (today - 30) && draft = false 的帖子
  • 我必须更改客户端以添加草稿约束

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

【问题讨论】:

  • 这取决于客户要求的representation format。由于给定的示例类似于HAL JSON,因此我将_links 保留在顶层。
  • 尽管我提出了问题,这是否意味着我应该通过查询/posts 并阅读_links 属性来发现别名/posts/new
  • 有没有考虑在服务返回的链接中加入查询参数?这样,您的选项 3 将不再将客户端逻辑与服务器逻辑耦合。无论服务认为是什么new,客户端都可以盲目使用链接(包括查询参数)。

标签: rest hateoas


【解决方案1】:

在 REST 架构中,URI 应通过其随附的链接关系名称来发现。在将上面的示例解释为 HAL 时,URI /post/new 的链接关系名称为 new。链接关系名称为 URI 提供语义,允许客户端确定何时调用这些 URI。 HAL 只是少数支持 HATEOAS 的基于 JSON 的媒体类型之一。有可用的 further media-types 提供类似的作业,但语法和功能略有不同。

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

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

指包含资源集合中最新项目的资源。

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

【讨论】:

  • 我希望我理解正确,我应该以某种方式(例如,作为对 / 的回应)提供 API“地图”,其中将列出 /posts/new 和其他子链接。
【解决方案2】:

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

这是来自 C# 项目的示例(请注意,链接都是相同的,唯一的变化是 HTTP_METHOD 和/或传递的参数):

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多