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

时间:2012-08-27 13:11:38

标签: http web httprequest web-deployment

我已经阅读了很多相关内容,但无法就此主题得出结论。

但我从未使用过PUT或DELETE HTTP Request方法。我倾向于在系统(我的应用程序或网站)的统计数据可能不受影响(如产品列表)时使用GET,并在受影响时使用POST(下订单)。这还不够,还是我错过了什么?

4 个答案:

答案 0 :(得分:79)

DELETE用于删除请求资源:

  

DELETE方法请求源服务器删除Request-URI标识的资源。可以通过源服务器上的人为干预(或其他方式)覆盖此方法。即使从源服务器返回的状态代码表明操作已成功完成,也无法保证客户端已执行该操作...

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

  

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

有关完整规范,请访问:

Since current browsers unfortunately do not support any other verbs than POST and GET in HTML forms,你通常无法使用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正文中提供更新的资源表示,供网络服务器应用。

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

有关详细信息,请访问:

答案 1 :(得分:23)

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

从中看到好处的最简单方法是查看此示例。 每个MVC框架都有一个Router/Dispatcher,它将URL-s映射到actionControllers。 所以这样的网址:/blog/article/1会调用blogController::articleAction($id); 现在,此路由器仅识别URL或/blog/article/1/

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

这将使您能够配置应用程序,以便它可以接受相同的URL并将其映射到不同的actionControllers,具体取决于HTTP Request动词。

例如:

如果你想要翻阅第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 Fundamentals

Symfony 2 - Routing

这些文章是关于Symfony 2框架的,但它们可以帮助您弄清楚HTTP请求和响应如何工作。

希望这有帮助!

答案 2 :(得分:4)

尽管我冒着不受欢迎的风险,但我说它们在当今没有用

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

事情发展了,URL变成了虚拟的(例如,参见 URL重写),使资源失去了真实文件夹/ subforder / file的初始含义,因此,HTTP协议方法(GET, POST,PUT / PATCH,DELETE)丢失了曲目。

让我们举个例子:

  • / 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可以使以后更易于使用和维护

答案 3 :(得分:0)

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

根据您的要求:

1)为了安全和幂等的操作(获取资源),请使用--------- 获取方法
2)对于不安全且非幂等的操作(插入资源),请使用--------- POST方法
3)对于不安全和幂等的操作(更新资源),请使用---------- PUT方法
3)对于不安全和幂等的操作(删除资源),请使用--------- 删除方法