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

介绍

我读了以下内容:

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

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

哼?

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

PUT和,他们说。我只听说过,也从未在我看过的任何PHP代码中看到过类似或路过的东西。DELETEPOSTGET$_PUT$_DELETE

我的问题

这些方法(PUT)和(DELETE)有什么用,如果可以在PHP中使用它们,我将如何去做。

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


答案 1

这些方法(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
  • 请求标头,如用户代理、主机、内容长度等
  • (请求的可选正文)

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

因此,PUT 请求将如下所示:

PUT /something/index.php

(body) maybe=aparameter

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

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 状态 - 无内容-))。


答案 2

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

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

推荐