所以,假设我们有一些似乎不能最好地表示为资源的东西(我们想要暂停的进程状态,我们想要在服务器上执行的无状态计算等)。
如果在API设计中我们使用process/123/pause
或calculations/fibonacci
- 这与REST根本不兼容吗?只要这些URL可以使用HATEOAS发现并且媒体类型是标准化的,那么我所阅读的内容似乎并不存在。
或者我是否应该按照here的答案在邮件中添加操作?
注1:
我确实理解我可以用名词来重新描述我的一些例子。但是我觉得对于特定情况名词不像动词那样有效。所以我试图理解是否有这些动词会立即取消。如果确实如此,那么为什么推荐如此严格,以及在这些情况下不遵循它会给我带来什么好处。
注2:
回答“REST对此没有任何限制”将是一个有效的答案(这意味着这种方法是RESTful)。答案“这取决于你问谁”或“这是一种最佳做法”并没有真正回答这个问题。这个问题假定REST的概念存在于一个明确定义的常用术语中,两个人可以用它来引用同一组约束。如果假设本身不正确并且REST的正式讨论毫无意义,请说出来。
答案 0 :(得分:26)
本文提供了一些很好的提示:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
引用文章:
那些不适合CRUD操作世界的行为呢?
这是事情变得模糊的地方。有很多方法:
将操作重组为显示为资源字段。如果操作不采用参数,则此方法有效。例如,激活动作可以映射到布尔激活的字段,并通过PATCH更新到资源。
将其视为具有RESTful原则的子资源。例如,GitHub的API让你用PUT / gists /:id / star和unstar与DELETE / gists /:id / star打造一个要点。
- 醇>
有时候你真的无法将动作映射到合理的RESTful结构。例如,多资源搜索并不是真的 有意义地应用于特定资源的端点。在这 case,/ search尽管不是名词,但最有意义。 这没关系 - 只是从API的角度做正确的事情 消费者并确保明确记录以避免混淆。
我个人喜欢建议#2。如果你需要暂停某些事情,你还在暂停什么?如果它是一个带有名称的进程,那么试试这个:
/process/{processName}/pause
答案 1 :(得分:26)
严格来说,这不是名词与动词的关系;这是关于你是否:
什么是资源?菲尔丁如此定义:
REST中信息的关键抽象是一种资源。可以命名的任何信息都可以是资源:文档或图像,临时服务(例如“洛杉矶的今天天气”),其他资源的集合,非虚拟对象(例如人)等等。换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义。资源是对一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体。“
现在,问你的问题。你不能只看一个URL并说:“这样的URL是否与REST根本不兼容?”因为REST系统中的URL并不是真正重要的一点。更重要的是,网址process/123/pause
和calculations/fibonacci
通过上述定义来识别资源。如果是这样,则不存在REST约束违规。如果他们不这样做,则违反了REST的统一接口约束。您的示例让我相信它不符合资源定义,因此会违反此约束。
为了说明可能在此系统中的内容,您可以通过将其发布到paused-processes
资源集合来更改进程的状态。虽然这可能是处理进程的一种不寻常的方式,但它与REST架构风格并没有根本不相容。
在计算的情况下,计算本身可能是资源,而资源可能如下所示:
Request:
GET /calculations/5
Response:
{
fibonacci: 5,
prime-number: true,
square-root: 2.23607
}
尽管如此,这是一个有点不同寻常的资源概念。我认为稍微更典型的用法可能如下所示:
Request:
GET /stored-calculations/12381728 (note that URL is a random identifier)
Response:
{
number: 5,
fibonacci: 5,
prime-number: true,
square-root: 2.23607
}
虽然大概你想要存储关于该资源的其他信息,而不是任何人都可以用计算器进行的计算......
Response:
{
number: 5,
fibonacci: 5,
prime-number: true,
square-root: 2.23607,
last-accessed-date: 2013-10-28T00:00:00Z,
number-of-retrievals-of-this-resource: 183
}
答案 2 :(得分:4)
在REST API中使用动词被认为是不好的做法。
SO和其他地方有一些关于为什么以及如何避免使用动词的材料。话虽如此,有很多使用动词的“REST”API。
对于您的process
API,我会让资源Process有一个state
字段,可以使用PUT
进行修改。
假设GET /process/$id
当前返回:
{
state: "PAUSED"
}
然后你PUT
将此/process/$id
:
{
state: "RUNNING"
}
使流程改变状态。
对于Fibonacci,只需要一个名为fibonacci
的资源,并使用带有参数的POST
(例如 n 代表第一个 n 身体中的斐波那契数字,或者甚至是GET
,其中包含URL中的查询。
答案 3 :(得分:0)
HTTP方法 动词:GET,PUT,POST等等,而URL应始终引用名词(动作的接收者)。可以这样想:句子中的两个动词是否有意义? “GET计算”是无稽之谈,其中“GET状态”是好的,“GET过程”更好(“状态”是进程的元数据)。