因此,假设我们有一些似乎不能最好地表示为资源的东西(我们想要暂停的进程状态,我们想要在服务器上执行的无状态计算等).
如果在API设计中我们使用process/123/pause或者calculations/fibonacci- 从根本上与REST不兼容吗?只要这些URL可以使用HATEOAS发现并且媒体类型是标准化的,那么到目前为止,我似乎没有看到它.
或者我是否应该在此处回答的消息中添加操作?
注1:
我确实理解可以用名词来改写我的一些例子.但是我觉得,对于特定情况,名词不像动词那样有效.所以我试图理解是否有这些动词会立即取消.如果是,那么为什么推荐是如此严格,以及在这些情况下不遵循它可能会让我感到遗憾.
注2:
答案"REST对此没有任何限制"将是一个有效的答案(这意味着这种方法是RESTful).答案"这取决于你问谁"或"这是一种最佳做法"并没有真正回答这个问题.这个问题假定REST的概念存在于一个明确定义的常用术语中,两个人可以使用它来引用同一组约束.如果假设本身不正确并且REST的正式讨论毫无意义,请说出来.
ccl*_*eve 29
本文有一些很好的提示: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结构.例如,多资源搜索实际上没有意义应用于特定资源的端点.在这种情况下,/搜索将是最有意义的,即使它不是名词.这没关系 - 只需从API使用者的角度做正确的事情,并确保明确记录以避免混淆.
我个人喜欢建议#2.如果你需要暂停某些事情,你还在暂停什么?如果它是一个带有名称的进程,那么试试这个:
/process/{processName}/pause
Run Code Online (Sandbox Code Playgroud)
Jon*_*n W 28
它并不严格关于名词与动词的关系; 这是关于你是否:
什么是资源?菲尔丁如此定义:
REST中信息的关键抽象是一种资源.可以命名的任何信息都可以是资源:文档或图像,临时服务(例如"洛杉矶的今天天气"),其他资源的集合,非虚拟对象(例如人)等等.换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义.资源是对一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体."
现在,问你的问题.你不能只看一个URL并说:"这样的URL是否与REST根本不兼容?" 因为REST系统中的URL并不是真正重要的一点.根据上述定义,URL process/123/pause和calculations/fibonacci识别资源更为重要.如果是这样,则不存在REST约束违规.如果他们不这样做,则违反了REST的统一接口约束.您的示例让我相信它不符合资源定义,因此会违反此约束.
为了说明此系统中的资源可能是什么,您可以通过将其POST到paused-processes资源集合来更改进程的状态.虽然这可能是处理进程的一种不寻常的方式,但它与REST架构风格并没有根本的不兼容.
在计算的情况下,计算本身可能是资源,该资源可能如下所示:
Request:
GET /calculations/5
Response:
{
fibonacci: 5,
prime-number: true,
square-root: 2.23607
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,这是一个有点不同寻常的资源概念.我想稍微更典型的用法可能如下所示:
Request:
GET /stored-calculations/12381728 (note that URL is a random identifier)
Response:
{
number: 5,
fibonacci: 5,
prime-number: true,
square-root: 2.23607
}
Run Code Online (Sandbox Code Playgroud)
虽然大概你想存储关于该资源的其他信息,而不是任何人都可以用计算器进行的计算......
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
}
Run Code Online (Sandbox Code Playgroud)
在REST API中使用动词被认为是不好的做法。
在SO和其他地方,有一些关于为什么以及如何避免使用动词的材料。就是说,有很多使用动词的“ REST” API。
对于您的processAPI,我将使资源Process具有一个state字段,可以使用进行修改PUT。
假设GET /process/$id当前返回:
{
state: "PAUSED"
}
Run Code Online (Sandbox Code Playgroud)
然后你PUT这个到/process/$id:
{
state: "RUNNING"
}
Run Code Online (Sandbox Code Playgroud)
这会使过程更改状态。
在斐波那契数的情况下,只需有一个名为资源fibonacci,并使用POST带有参数(比如ñ第一个ñ体内Fibonacci数),或者甚至GET与URL中的查询。