HTTP 协议的 PUT 和 DELETE 及其在 PHP 中的使用

新手上路,请多包涵

介绍

我已阅读以下内容:

超文本传输协议 (HTTP) 是网络的生命。每次传输文档或发出 AJAX 请求时都会使用它。但令人惊讶的是,HTTP 在一些 Web 开发人员中相对未知。

HTTP 动词构成了我们“统一接口”约束的主要部分,并为我们提供了与基于名词的资源对应的动作。主要或最常用的 HTTP 动词(或正确称呼的方法)是 POST、GET、 PUTDELETE

嗯?

好吧,我们到了我忘记了事情的地步。

PUTDELETE ,他们说。 I’ve only ever heard of POST and GET and never saw something like $_PUT or $_DELETE passing by in any PHP code I’看过。

我的问题

这些方法 (PUT) 和 (DELETE) 的用途是什么,如果可以在 PHP 中使用它们,我将如何处理。

注意: 我知道这不是一个真正的问题,但如果我看到一个,我总是会抓住一个学习机会,如果可能的话,我非常想学习在 PHP 中使用这些方法。

原文由 user4446130 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

这些方法 (PUT) 和 (DELETE) 用于…

有很多话要花在解释这一点上,我还不够熟练,但正如已经发布的那样,快速回顾一下 HTTP 规范 所描述的内容。

该协议基本上是这样说的:

  • 当您需要 访问资源和检索数据 时使用 GET ,并且您不必修改或更改此数据的状态。

  • 当您需要向服务器 发送一些数据 时使用 POST 。前任。从表单中将这些数据保存在某处。

  • 当您需要 访问资源并仅从响应中检索标头 而不需要任何资源数据时,请使用 HEAD

  • 当您需要 替换该系统上已存在的某些数据的状态 时,请使用 PUT

  • 当您需要 删除该系统上的资源(相对于您发送的 URI)时,请使用 DELETE

  • 当您需要从资源中获取通信选项时使用 OPTIONS ,以便 检查该资源的允许方法。前任。我们将它用于 CORS 请求和权限规则。

  • 您可以阅读该文档中剩余的两种方法,抱歉我从未使用过。

基本上,协议是您应该在应用程序中使用以遵守它的一组规则。


…如果可以在 PHP 中使用它们,我将如何处理。

从您的 php 应用程序中,您可以通过查看超级全局数组 $_SERVER 并检查字段 REQUEST_METHOD 的值来检索使用的方法。

因此,从您的 php 应用程序中,您现在可以识别这是 DELETE 还是 PUT 请求,例如。 $_SERVER['REQUEST_METHOD'] === 'DELETE'$_SERVER['REQUEST_METHOD'] === 'PUT'

* 另请注意,某些处理不支持 PUT 或 DELETE 方法的浏览器的应用程序使用以下技巧,即 html 表单中的隐藏字段,其值属性中指定动词,例如:

 <input name="_method" type="hidden" value="delete" />


遵循一个简单描述处理这 2 个 http 请求的可能方式的示例

当您(您的浏览器、您的客户端)向 HTTP 服务器请求资源时,您必须使用协议 (HTTP) 接受的方法之一。所以你的请求需要通过:

  • 一个方法
  • 资源的 Uri
  • 请求标头,例如 User-Agent、Host、Content-Length 等
  • (请求的可选正文)

现在,虽然您可以使用各自的全局变量( $_GET$_POST )从 POST 和 GET 请求中获取数据,但在 PUT 和 DELETE 请求的情况下 PHP 不提供这些快速访问全局变量;但是您可以使用 $_SERVER['REQUEST_METHOD'] 的值来检查请求中的方法并相应地处理您的逻辑。

所以 一个 PUT 请求看起来像:

 PUT /something/index.php

(body) maybe=aparameter

您可以通过读取 php://input 流来访问 PHP 中的这些数据,例如。有类似的东西:

 if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
    $myEntireBody = file_get_contents('php://input'); //Be aware that the stream can only be read once
}

DELETE 请求如下所示:

 DELETE /something/index.php?maybe=aparameter

再次检查方法后,您可以构建逻辑:

 if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    // do something
}

请注意 DELETE 请求没有正文,并非常注意响应状态代码(例如,如果您收到 PUT 请求并且您已正确更新该资源,则应返回 204 状态 -No content-)

原文由 ilpaijin 发布,翻译遵循 CC BY-SA 4.0 许可协议

从 PHP 中使用 PUT 数据的方法:

 $method = $_SERVER['REQUEST_METHOD'];
if ('PUT' === $method) {
    parse_str(file_get_contents('php://input'), $_PUT);
    var_dump($_PUT); //$_PUT contains put fields
}

原文由 AndreyP 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题