假设我有一个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
的帖子注意:帖子只是我一般要求的一个例子。
答案 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)