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
和查询参数。但是,如果我更改我的服务器逻辑,我也必须更改客户端逻辑,这将是服务-客户端耦合。例如:
- 客户端将通过某种方式提供参数
timestamp > (today - 30)
来请求新消息
- 我介绍
draft
属性,改变我的想法,新的只是timestamp > (today - 30) && draft = false
的帖子
- 我必须更改客户端以添加草稿约束
注意:帖子只是我一般问的一个例子。
好吧,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
。
假设我有一个 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
属性,改变我的想法,新的只是timestamp > (today - 30) && draft = false
的帖子
- 我必须更改客户端以添加草稿约束
注意:帖子只是我一般问的一个例子。
好吧,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
。