最佳/常见的RESTful网址动词和动作是什么?


86

我正在尝试查找有关最佳和最常见的RESTful url操作的信息。

例如,您使用什么URL来显示项目的详细信息,用于编辑项目,进行更新等。

/question/show/<whatever>
/question/edit/<whatever>
/question/update/<whatever> (this is the post back url)
/question/list   (lists the questions)

嗯。感谢任何人的帮助:)

Answers:


173

使用URL来指定您的对象,而不是您的操作:

请注意,您首先提到的不是RESTful:

/questions/show/<whatever>

相反,您应该使用URL来指定对象:

/questions/<question>

然后,您对该资源执行以下操作之一。


得到:

用于获取资源,查询资源列表以及查询资源的只读信息。

要获取问题资源:

GET /questions/<question> HTTP/1.1
Host: whateverblahblah.com

列出所有问题资源:

GET /questions HTTP/1.1
Host: whateverblahblah.com

开机自检:

用于创建资源。

请注意以下是错误:

POST /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

如果尚未创建URL,则在指定名称时不应使用POST来创建URL。这将导致资源未找到错误,因为尚不存在。您应该先将资源放在服务器上。您可能会争辩说,通过创建一个新问题,您还正在更新/ questions资源,因为它现在将在其问题列表中返回另一个问题。

您应该执行以下操作以使用POST创建资源:

POST /questions HTTP/1.1
Host: whateverblahblah.com

请注意,在这种情况下,未指定资源名称,新的对象URL路径将返回给您。

删除:

用于删除资源。

DELETE /questions/<question> HTTP/1.1
Host: whateverblahblah.com

放:

指定资源URL时,用于创建资源或覆盖资源。

对于新资源:

PUT /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

覆盖现有资源:

PUT /questions/<existing_question> HTTP/1.1
Host: whateverblahblah.com

...是的,它们是相同的。PUT通常被称为“编辑”方法,因为通过用稍有改动的版本替换整个资源,您已经编辑了客户端下次执行时将获取的内容。


在HTML表单中使用REST:

HTML5规范定义GET和POST form元素

方法内容属性是具有以下关键字和状态的枚举属性:

  • 关键字GET,映射到状态GET,指示HTTP GET方法。
  • 关键字POST,映射到状态POST,指示HTTP POST方法。

从技术上讲,HTTP规范并不仅限于这些方法。从技术上讲,您可以自由添加所需的任何方法,但实际上,这不是一个好主意。这个想法是每个人都知道您使用GET来读取数据,因此如果您决定改用READ的话,这将使您感到困惑。那说...

补丁:

这是在正式RFC中定义的方法。它旨在用于您只希望对资源发送部分修改的情况,就像PUT一样使用:

PATCH /questions/<new_question> HTTP/1.1
Host: whateverblahblah.com

所不同的是PUT必须发送整个资源,不管它有多大相比,有什么实际改变,而PATCH你可以给刚刚更改。


嗨,布莱恩..我读得越多,它的意义就越大。我假设某些浏览器(或浏览器版本)不支持PUT或DELETE?如果是这样,我们改用POST吗?
Pure.Krome

1
嗨Pure.Knome; Web浏览器全部支持它们,任何HTTP库也应全部支持它们。
Brian R. Bondy

4
如果您想了解所有有关REST的知识,
Brian R. Bondy

1
@Brian:关于您的PUT示例的其他问题。>> PUT / questions / <new_question>为什么要这样做,而不是>> PUT / questions /,因为表单中的所有数据都将用于创建新资源?(续下
一条

1
@Brian R. Bondy,谢谢您的出色回答。与现有资源“修改”一词相反,在oreilly的书中(pg:100,101)将对现有资源的POST请求描述为“追加”。毕竟,追加比修改更具体-修改可能会传达“ PUT到现有资源”-语义上对于POST听起来更正确-通过向该链接添加或创建子资源,将新资源添加到指定的链接。
Özgür的

11

假设/questions/10是一个有效的问题,则使用该方法与之交互。

开机自检添加到它

放置以创建或替换它

获取以查看/查询它

并删除到..删除它。

网址不变。


4
错误。PUT必须是幂等的。您必须能够多次发出相同的PUT请求,但第一次之后没有任何效果。因此,对于每个PUT请求都创建资源不是幂等的。
aehlke

3
“将方法PUT和DELETE定义为等幂的,这意味着多个相同的请求应该与单个请求具有相同的效果。”,在当前无法使资源可用的URI上使用put可以创建资源。立即再次放入将仅再次执行,这将无效。这样,您正在创建资源,但是查询仍然是幂等的。如果稍后返回并希望更改资源,则可以使用不同的数据将PUT设置为相同的URI(这将是不同的请求,并且本身可以重复多次以得到相同的结果)。
阿兰·拉隆德

1
实际上,请看上面获得25票的答案,上面说PUT可用于创建或替换资源。
艾伦·拉隆德

3
创建仅在允许指定新资源的ID的情况下起作用。尽管这是可行的,但让用户更便利地发布到/
collect

2
@aehIke通过PUT创建新资源不会使其成为非幂等,因为这样的想法是,如果我'PUT / items / 10'并且第10项不存在,那么它将被创建。但是,如果我第二次再次“ PUT / items / 10”,那么现在它已经存在,因此将被替换,因此保留了幂等性,因为后续的PUT请求没有新的副作用。(当然,这是假设我每次都继续放入相同的确切项目)
Alappin

3

我要出去肢体和猜你你的意思是什么是MVC标准控制器,当你说“REST风格”的网址,因为你的例子可以被视为非“REST风格”(见文章)。

由于Rails确实普及了您似乎感兴趣的URL样式,因此在下面提供了Ruby on Rails中ScaffoldingGenerator产生的默认控制器操作。使用Rails应用程序的任何人都应该熟悉这些。

脚手架的动作和视图是:索引,列表,显示,新建,创建,编辑,更新,销毁

通常,您可以将其构造为:

http://application.com/controller/<action>/<id>

5
带外URI约定不是RESTful的。引用菲尔丁本人的话:“ REST API不能定义固定的资源名称或层次结构(客户端和服务器之间明显的耦合)。服务器必须具有控制自己的名称空间的自由。相反,允许服务器指导客户端如何构造适当的URI。 ,例如在HTML表单和URI模板中通过在媒体类型和链接关系中定义这些指令来完成。”
aehlke,2009年

1

这是使用REST原理的当前URL的映射:

/question/show/<whatever>

如果您将问题标识为资源,那么它应该具有唯一的URL。通常使用GET来显示(检索)它。它成为了:

GET /question/<whatever>

/question/edit/<whatever>

现在,您希望用户对同一资源有另一个视图,该视图允许他编辑该资源(也许使用表单控件)。

这里有两个选择,您的应用程序是一个应用程序(不是网站),那么使用JavaScript将资源转换为客户端上的可编辑资源可能会更好。

如果这是一个网站,则可以使用带有其他信息的相同URL来指定另一个视图,通常的做法是:

GET /question/<whatever>;edit

/question/update/<whatever> (this is the post back url)

这是为了改变问题,因此PUT是使用的正确方法:

PUT /question/<whatever>

/question/list   (lists the questions)

问题列表实际上是问题的父资源,因此自然是:

GET /question

现在您可能需要更多:

POST /question (create a new question and returns its URL)
DELETE /question/<whatever> (deletes a question if this is relevant)

多田:)


-1

您的四个示例可能是:

GET /questions/123
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
POST (or PUT) /questions/123 q=What+is+the+meaning+of+life
GET /questions

要添加一个问题:

POST /questions q=What+is+the+meaning+of+life

服务器将响应:

200 OK (or 201 Created)
Location: /questions/456
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.