【发布时间】: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,客户端都可以盲目使用链接(包括查询参数)。