因此,假设我们有一些似乎不能最好地表示为资源的东西(我们想要暂停的进程状态,我们想要在服务器上执行的无状态计算等) .
如果在API设计中我们使用 process/123/pause
或 calculations/fibonacci
- 这与REST根本不兼容吗?只要这些URL可以使用HATEOAS发现并且媒体类型是标准化的,那么到目前为止,我似乎没有看到它 .
或者我是否应该像回答here那样在消息中添加操作?
Note 1:
我确实理解我可以用名词来重新描述我的一些例子 . 但是我觉得,对于特定情况,名词不像动词那样有效 . 所以我试图理解是否有这些动词会立即取消 . 如果是,那么为什么推荐是如此严格,以及在这些情况下不遵循它可能会让我感到遗憾 .
Note 2:
回答"REST does not have any constraints on that"将是一个有效的答案(这意味着这种方法是RESTful) . 答案"it depends on who you ask"或"it is a best practice"并没有真正回答这个问题 . 这个问题假定REST的概念存在于一个明确定义的常用术语中,两个人可以使用它来引用同一组约束 . 如果假设本身不正确并且REST的正式讨论毫无意义,请说出来 .
4 回答
它并不严格关于名词与动词的关系;这是关于你是否:
识别资源
通过表示来操纵资源
什么是资源?菲尔丁如此定义:
现在,问你的问题 . 你可以真正重要的一点 . 更重要的是,URL
process/123/pause
和calculations/fibonacci
通过上述定义来识别资源 . 如果他们这样做,那么就没有违反REST的统一接口约束 . 您的示例让我相信它不符合资源定义,因此会违反此约束 .要说明此系统中的资源可能是什么,您可以通过将其POST到
paused-processes
资源集合来更改进程的状态 . 虽然这可能是处理进程的一种不寻常的方式,但它与REST架构风格并没有根本的不兼容 .在计算的情况下,计算本身可能是资源,该资源可能如下所示:
尽管如此,这是一个有点不同寻常的资源概念 . 我想稍微更典型的用法可能如下所示:
虽然大概你想存储关于该资源的其他信息,而不是任何人都可以用计算器进行的计算......
这篇文章有一些很好的提示:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
引用文章:
我个人喜欢建议#2 . 如果你需要暂停某些事情,你还在暂停什么?如果它是一个带有名称的进程,那么试试这个:
在REST API中使用动词被认为是不好的做法 .
有一些材料SO和其他地方为什么以及如何避免使用动词 . 话虽这么说,有很多_b34136_ API使用动词 .
对于
process
API,我会让资源Process有一个state
字段,可以使用PUT
进行修改 .假设
GET /process/$id
当前返回:然后你
PUT
这到/process/$id
:这使得流程改变了状态 .
在Fibonacci的情况下,只需要一个名为
fibonacci
的资源,并使用带有参数的POST
(比如n代表前n个斐波那契数字),或者甚至可以使用URL中的查询GET
.HTTP方法是动词:GET,PUT,POST等,而URL应始终引用名词(动作的接收者) . 可以这样想:句子中的两个动词是否有意义? "GET calculate"是无意义的,其中"GET state"是好的,"GET process"更好("state"是进程的元数据) .