在URL中使用动词从根本上与REST不兼容吗?

And*_*kin 51 rest

因此,假设我们有一些似乎不能最好地表示为资源的东西(我们想要暂停的进程状态,我们想要在服务器上执行的无状态计算等).

如果在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操作世界的行为呢?

这是事情变得模糊的地方.有很多方法:

  1. 将操作重组为显示为资源字段.如果操作不采用参数,则此方法有效.例如,激活动作可以映射到布尔激活的字段,并通过PATCH更新到资源.

  2. 将其视为具有RESTful原则的子资源.例如,GitHub的API让你用PUT/gists /:id/star和unstar与DELETE/gists /:id/star加注.

  3. 有时你真的无法将动作映射到合理的RESTful结构.例如,多资源搜索实际上没有意义应用于特定资源的端点.在这种情况下,/搜索将是最有意义的,即使它不是名词.这没关系 - 只需从API使用者的角度做正确的事情,并确保明确记录以避免混淆.

我个人喜欢建议#2.如果你需要暂停某些事情,你还在暂停什么?如果它是一个带有名称的进程,那么试试这个:

/process/{processName}/pause
Run Code Online (Sandbox Code Playgroud)

  • “暂停”示例是 RPC 样式而不是 REST。或者它正在创建一个“暂停”资源? (2认同)

Jon*_*n W 28

它并不严格关于名词与动词的关系; 这是关于你是否:

  • 识别资源
  • 通过表示来操纵资源

什么是资源?菲尔丁如此定义:

REST中信息的关键抽象是一种资源.可以命名的任何信息都可以是资源:文档或图像,临时服务(例如"洛杉矶的今天天气"),其他资源的集合,非虚拟对象(例如人)等等.换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义.资源是对一组实体的概念映射,而不是与任何特定时间点的映射相对应的实体."

现在,问你的问题.你不能只看一个URL并说:"这样的URL是否与REST根本不兼容?" 因为REST系统中的URL并不是真正重要的一点.根据上述定义,URL process/123/pausecalculations/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)

  • 我觉得这个答案的大部分内容仍然试图回答一个不同的问题(如何重构我的方法)——但是这个引用是有用的。看来如果我想使用动词,我应该将其建模为暂停消息来处理 url,而不是暂停 url。 (2认同)

Boj*_*Boj 5

在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中的查询。