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

时间:2018-11-09 11:11:33

标签: rest hateoas

假设我有一个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的帖子
  • 我必须更改客户端以添加草稿约束

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

2 个答案:

答案 0 :(得分:0)

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

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

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

  

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

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

答案 1 :(得分:-2)

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

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

enter image description here

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