PUT和DELETE HTTP请求方法的作用是什么?


89

我已经阅读了很多有关此的内容,但无法得出关于该主题的结论。

但是我从未使用过PUT或DELETE HTTP Request方法。我倾向于在系统状态(我的应用程序或网站)的统计信息不受影响(例如产品列表)时使用GET,而在系统统计信息受到影响(下订单)时使用POST。这还不够吗?我想念什么吗?


2
PUT / DELETE更容易编码,但更难设置(安全方面-vhost / apache目录)。我的拙见...您可以没有那些生活。
Najzero 2012年

5
@Najzero是的,如果没有他们,我会感到非常高兴:),但需要一些答案来说明为什么他们在那里?已经读了一些东西但是却无法应付
Rupesh Patel 2012年

Answers:


88

DELETE用于删除请求资源:

DELETE方法请求原始服务器删除由Request-URI标识的资源。在原始服务器上,人为干预(或其他方式)可能会覆盖此方法。即使从原始服务器返回的状态代码指示操作已成功完成,也不能保证客户机已执行了操作…

PUT用于在服务器上放置或更新资源:

PUT方法请求将封闭的实体存储在提供的Request-URI下。如果Request-URI引用了已经存在的资源,则应将封闭的实体视为驻留在原始服务器上的实体的修改版本。如果Request-URI没有指向现有资源,并且请求用户代理能够将该URI定义为新资源,则原始服务器可以使用该URI创建资源。

有关完整的规范,请访问:

不幸的是,由于当前的浏览器不支持HTML形式的POST和GET以外的其他动词,因此您通常无法充分利用HTTP(尽管您仍然可以通过JavaScript劫持其提交)。HTML格式不支持这些方法,导致URI包含动词,例如

POST http://example.com/order/1/delete

甚至更糟

POST http://example.com/deleteOrder/id/1

通过HTTP有效地隧穿CRUD语义。但是,动词从未打算成为URI的一部分。相反,HTTP已经提供了通过HTTP方法对资源(例如订单)进行CRUD的机制和语义。HTTP是一种协议,而不仅仅是某些数据隧道服务。

因此,要删除网络服务器上的资源,请致电

DELETE http://example.com/order/1

并更新它,你会打电话给

PUT http://example.com/order/1

并在PUT主体中提供更新的资源表示,以供Web服务器应用。

因此,如果要为REST API构建某种客户端,则可能会使它发送PUT和DELETE请求。这可能是内置在浏览器中的客户端,例如通过JavaScript发送请求,也可能是服务器上运行的某些工具,等等。

有关更多详细信息,请访问:


7
浏览器可以使用JavaScript发送PUT和DELETE!

5
@Joe是的,但是HTML表单方法没有。而且,只要开箱即用不支持该功能,您就必须经过箍才能使其正常工作。这是浏览器供应商的主要失败之一。
戈登

3
当然不是,表单是为POST和GET设计的。那就是设计HTML。并不是说不支持PUT和DELETE。浏览器实现HTML和HTTP。

@Joe我们可能对“支持”没有相同的定义。大多数浏览器都支持JavaScript,是的,JavaScript可以执行HTTP请求,但是我仍然必须对其进行编程,将代码绑定到某些UI元素,然后首先将其交付给客户端。
戈登

4
除非您编写一些HTML,否则浏览器将显示一个空白页。是的,也许我们不得不不同意。意见还可以!

26

使用HTTP请求动词(例如GET,POST,DELETE,PUT等)使您能够构建RESTful Web应用程序。在此处阅读有关内容:http : //en.wikipedia.org/wiki/Representational_state_transfer

要从中受益的最简单方法就是看这个例子。每个MVC框架都有一个Router/Dispatcher将URL映射到actionController的框架。因此,像这样的URL:/blog/article/1blogController::articleAction($id); 立即调用此路由器知道该URL或/blog/article/1/

但是,如果该路由器知道整个HTTP请求对象而不只是URL,那么他可以访问HTTP请求动词(GET,POST,PUT,DELETE ...)以及有关当前HTTP请求的许多其他有用信息。

这将使您能够配置应用程序,以便它可以接受相同的URL并根据HTTP请求动词将其映射到不同的actionController。

例如:

如果要检索第1条,可以执行以下操作:

GET /blog/article/1 HTTP/1.1

但是,如果您要删除第1条,则可以执行以下操作:

DELETE /blog/article/1 HTTP/1.1

请注意,两个HTTP请求都具有相同的URI / blog / article / 1,唯一的区别是HTTP请求动词。根据该动词,您的路由器可以调用不同的actionController。这使您能够构建简洁的URL。

阅读这两篇文章,它们可能会为您提供帮助:

Symfony 2-HTTP基础知识

Symfony 2-路由

这些文章是关于Symfony 2框架的,但它们可以帮助您了解HTTP请求和响应的工作方式。

希望这可以帮助!


6
即使我不是他们的朋友,也很好地解释了+1 ;-)
Najzero

1
这个答案最好地描述了HTTP动词的重要性,并与真正的RESTful服务及其好处保持一致。如果您不使用HTTP DELETE,那么您可能在控制器中执行(2)POST操作:1代表Create,1代表Delete。如果这样做,您的下一个搜索将是“如何在单个控制器中具有多个Post操作”:P。这并不是很糟糕,但是您失去了通过动词操作实现唯一资源的能力,而不必在URI中显式提供操作名称。
atconway 2014年

2

尽管我冒着不受欢迎的风险,但我说它们如今已无用

我认为它们在过去是很好的意图和用途,例如DELETE告诉服务器删除在提供的URL上找到的资源,而PUT(及其同级PATCH)告诉服务器以幂等方式进行更新。

事情发展了,URL变成了虚拟的(例如,参见URL重写),使资源失去了真正的文件夹/子用户/文件的初始含义,因此HTTP协议方法(GET,POST,PUT / PATCH,DELETE)覆盖的CRUD操作动词丢失了。

让我们举个例子:

  • / api / entity / list / {id}GET / api / entity / {id}
  • / api / entity / add / {id}POST / api / entity
  • / api / entity / edit / {id}PUT / api / entity / {id}
  • / api / entity / delete / {id}DELETE / api / entity / {id}

左侧没有写HTTP方法,本质上没关系(POST和GET就足够了),右侧使用了适当的HTTP方法。

右侧看起来优雅,干净,专业。想象一下,现在您必须维护一直使用优雅API的代码,并且必须搜索删除调用的完成位置。您将搜索“ api / entity”,然后在结果中必须查看哪个正在执行DELETE。甚至更糟的是,您有一个初级程序员,错误地用DELETE切换了PUT,并且URL同样发生了。

在我看来,将动作动词放入URL中比使用适当的HTTP方法执行该动作具有优势,即使它不太优雅。如果您想查看在何处进行删除调用,只需搜索“ api / entity / delete”,即可直接找到它。

在不使用整个HTTP方法数组的情况下构建API可以使以后更易于使用和维护


1

安全方法:获取资源/资源无修改
幂等:如果多次请求,资源状态无变化
不安全方法:在资源中创建或更新资源/修改
非幂等:如果多次请求资源状态改变

根据您的要求:

1)对于安全且等幂的操作(获取资源),请使用--------- GET方法;
2)对于不安全且等幂的操作(插入资源),请使用--------- POST方法:
3)对于不安全且幂等的操作(更新资源),请使用---------放置方法
3)对于不安全且幂等的操作(删除资源),请使用---------删除方法

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.