在REST中,资源由其URI标识,允许的操作仅限于可用的HTTP谓词。RESTfull API是一个统一的接口,通过HTTP为资源提供基本的CRUD操作。
最后,REST体系结构声明资源应该包含超链接,以便客户端进一步遍历API。这被称为HATEOAS(作为应用程序状态引擎的超文本(。超链接将客户端代码与接口实现细节解耦。
使用HAEOAS链接以RPC样式传递针对资源的命令式命令是RESTful吗?我认为这不会破坏统一的界面,因为所有信息都在链接中提供。考虑以下示例,其中action不适合HTTP谓词。
GET /foo/1
{
id: 1,
foo: "foo",
links: {
self: "/foo/1",
doAction: "/foo/1/do-action"
}
}
POST /foo/1/do-action
或者我应该只使用请求参数将命令信息传递给资源端点,或者将命令建模为自己的资源?
使用HAEOAS链接以RPC样式传递针对资源的命令行命令是RESTful吗?
REST是一种体系结构风格;如果你想了解它是如何工作的,你应该在使用这种风格创建的应用程序中寻找类似物。对于REST,这些应用程序中最著名的是万维网。
因此,你的问题的答案来自于考虑你的情况与在网络上实现有用工作的关系;也就是说,通过浏览超链接,直到我们找到正确的表格,填写数据,然后提交。
{
id: 1,
foo: "foo",
links: {
self: "/foo/1",
doAction: "/foo/1/do-action"
}
}
因此,从REST的角度来看,问题变成了";通用组件如何知道如何使用doAction
">
在web上,我们有一个通用的表单标准,因此表单的超媒体表示携带了客户端为请求创建正确有效负载所需的信息。
在AtomPub中,该标准定义了各种文档中链接关系的语义,因此任何通用的atom客户端都知道如何解释响应中包含的数据。
(从某种意义上说,Atom中链接关系的定义与HTML中a和FORM的定义非常相似;它们具有通用性(。
因此,在您的上下文中,提示";doAction;应该通知客户端可以做的一些有趣的事情(在这里发布一个猫视频(。目标uri对客户端来说应该无关紧要;它应该只是在被告知的地方发送请求。
这里的目标uri的拼写根本不重要;但需要考虑的一个有趣的情况是,当目标uri与您在其他地方使用的uri相同时,就会发生这种情况,例如:
{
id: 1,
foo: "foo",
links: {
self: "/foo/1",
doAction: "/foo/1"
}
}
HTTP在标准中内置了简单的缓存无效语义;实际上,doAction
的目标告诉客户端,当操作成功时,哪个缓存表示将无效。