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

Rup*_*tel 83 http httprequest web-deployment web

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

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

Gor*_*don 82

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
Run Code Online (Sandbox Code Playgroud)

甚至更糟

POST http://example.com/deleteOrder/id/1
Run Code Online (Sandbox Code Playgroud)

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

因此,要删除网络服务器上的资源,您需要打电话

DELETE http://example.com/order/1
Run Code Online (Sandbox Code Playgroud)

并更新它你打电话

PUT http://example.com/order/1
Run Code Online (Sandbox Code Playgroud)

并在PUT正文中提供更新的资源表示,供Web服务器应用.

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

欲了解更多详情,请访问:

  • 浏览器*可以用JavaScript发送PUT和DELETE! (7认同)
  • @Joe是的,但HTML表单方法没有.只要不支持开箱即用,你就必须通过箍来使它工作.这是浏览器厂商的主要失败之一. (5认同)
  • 当然他们没有,表格是为POST和GET设计的.那就是设计HTML.但是,不支持PUT和DELETE是不正确的.浏览器实现HTML和HTTP. (3认同)
  • 除非您编写一些HTML,否则浏览器将显示空白页面.是的,也许我们不得不反对.不同意是好的! (3认同)
  • 例如,DELETE 可以执行诸如使 URI 的缓存版本无效之类的操作。对于基于 POST 的 API,您使用的任何代理要么必须知道您的 API 的作用(不好),要么完全关闭(也不好)。这就是我们使用标准的原因。:) (不过,如果表单有办法将 DELETE 绑定到提交按钮,那确实会很好。) (2认同)

Lim*_*eni 24

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

从中看到好处的最简单方法是查看此示例.每个MVC框架都有一个Router/Dispatcher将URL-s映射到actionControllers的框架.所以这样的URL:/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
Run Code Online (Sandbox Code Playgroud)

但如果你想删除第1条,你会这样做:

DELETE /blog/article/1 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

请注意,两个HTTP请求都具有相同的URI,/ blog/article/1,唯一的区别是HTTP Request动词.并且基于该动词,您的路由器可以调用不同的actionController.这使您可以构建整洁的URL.

阅读这两篇文章,他们可能会帮助您:

Symfony 2 - HTTP基础知识

Symfony 2 - 路由

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

希望这可以帮助!

  • 即使我不是他们的朋友,很好地解释+1 ;-) (6认同)

Bog*_*dan 7

虽然我冒着不受欢迎的风险,但我说它们现在没有用了

我认为它们在过去是很好的和有用的,例如 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}删除 /api/entity/{id}

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

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

在我看来,将动作动词放在 URL 中比为该动作使用适当的 HTTP 方法更有优势,即使它不是那么优雅。如果您想查看删除调用的位置,只需搜索“api/entity/delete”即可立即找到。

构建一个没有整个 HTTP 方法数组的 API 可以更容易地使用和维护