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

时间:2013-10-28 23:29:43

标签: rest

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

如果在API设计中我们使用process/123/pausecalculations/fibonacci - 这与REST根本不兼容吗?只要这些URL可以使用HATEOAS发现并且媒体类型是标准化的,那么我所阅读的内容似乎并不存在。

或者我是否应该按照here的答案在邮件中添加操作?

注1:
我确实理解我可以用名词来重新描述我的一些例子。但是我觉得对于特定情况名词不像动词那样有效。所以我试图理解是否有这些动词会立即取消。如果确实如此,那么为什么推荐如此严格,以及在这些情况下不遵循它会给我带来什么好处。

注2:
回答“REST对此没有任何限制”将是一个有效的答案(这意味着这种方法是RESTful)。答案“这取决于你问谁”“这是一种最佳做法”并没有真正回答这个问题。这个问题假定REST的概念存在于一个明确定义的常用术语中,两个人可以用它来引用同一组约束。如果假设本身不正确并且REST的正式讨论毫无意义,请说出来。

4 个答案:

答案 0 :(得分:26)

本文提供了一些很好的提示:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api

引用文章:

  

那些不适合CRUD操作世界的行为呢?

     

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

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

  2.   
  3. 将其视为具有RESTful原则的子资源。例如,GitHub的API让你用PUT / gists /:id / star和unstar与DELETE / gists /:id / star打造一个要点。

  4.   
  5. 有时候你真的无法将动作映射到合理的RESTful结构。例如,多资源搜索并不是真的   有意义地应用于特定资源的端点。在这   case,/ search尽管不是名词,但最有意义。   这没关系 - 只是从API的角度做正确的事情   消费者并确保明确记录以避免混淆。

  6.   

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

/process/{processName}/pause

答案 1 :(得分:26)

严格来说,这不是名词与动词的关系;这是关于你是否:

  • 识别资源
  • 通过陈述操纵资源

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

  

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

现在,问你的问题。你不能只看一个URL并说:“这样的URL是否与REST根本不兼容?”因为REST系统中的URL并不是真正重要的一点。更重要的是,网址process/123/pausecalculations/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过程”更好(“状态”是进程的元数据)。