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

HTTP protocol's PUT and DELETE and their usage in PHP

简介

我已阅读以下内容:

Hypertext Transfer Protocol (HTTP) is the life of the web. It's used every time you transfer a document, or make an AJAX request. But HTTP is surprisingly a relative unknown among some web developers.

The HTTP verbs comprise a major portion of our “uniform interface” constraint and provide us the action counterpart to the noun-based resource. The primary or most-commonly-used HTTP verbs (or methods, as they are properly called) are POST, GET, PUT, and DELETE.

嗯?

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

PUTDELETE,他们说。我只听说过 POSTGET,从来没有在我看过的任何 PHP 代码中看到 $_PUT$_DELETE 之类的东西。

我的问题

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

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

PHP 的 $_GET$_POST 命名不当。 $_GET 用于访问查询字符串参数的值,$_POST 用于访问请求正文。

使用查询字符串参数不限于 GET 请求,除 POST 之外的其他类型的请求都可以带有请求正文。

如果您想找出用于请求页面的动词,请使用 $_SERVER['REQUEST_METHOD']

What are these methods (PUT) and (DELETE)

described in the HTTP spec.

简而言之,稍微简化一下,PUT 用于将文件上传到 URL,DELETE 用于从 URL 删除文件。

never sawy something like $_PUT or $_DELETE passing by in any PHP code I've ever viewed

$_POST$_GET 被命名为超全局变量。 $_POST 用于从请求正文解析的数据。 $_GET 用于从 URL 解析的数据。没有任何东西可以将这些地方(尤其是 URL)中的数据严格绑定到特定的请求方法。

DELETE 请求只关心 URL 的路径,因此没有要解析的数据。

PUT 请求通常关心您将使用 file_get_contents('php://input');.

访问的整个请求主体(不是它的解析版本)

for and if it's possible to use them in PHP, how would I go about this.

您需要将 URL 映射到 PHP 脚本(例如使用 URL rewriting), test the request method, work out what URL you were actually dealing with,然后编写代码来执行适当的操作。

What are these methods (PUT) and (DELETE) for...

要解释这个要花很多话,我不够熟练,但是正如已经发布的那样,快速回顾一下 HTTP specification 描述的内容。

协议基本上是这样说的:

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

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

  • 当您需要访问资源并仅从响应[=102=中检索Headers时使用HEAD ], 没有任何资源数据。

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

  • 当您需要删除资源(相对于您发送的 URI)时使用 DELETE那个系统。

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

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

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


... and if it's possible to use them in PHP, how would I go about this.

从您的 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
  • 请求Headers,如User-Agent,主机,Content-Length等
  • (请求的可选body)

现在,虽然您可以从 POST 获取数据并使用相应的全局变量 ($_GET$_POST) 获取数据,但如果是 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 请求没有 Body 并非常注意响应状态代码(例如,如果您收到 PUT 请求并且您更新了该资源而没有错误你应该 return 204 状态 -No content-).

最适合使用这些(PUT 和 DELETE)方法的地方是 REST API。在我们使用 http 方法定义操作模式的地方,例如您想要获取任何资源,那么您可以使用以下内容:

GET http://api.example.com/employee/<any_id>

添加新项目:

POST http://api.example.com/employee/

更新或编辑:

PUT http://api.example.com/employee/

删除现有资源:

DELETE http://api.example.com/employee/1

等等

现在在PHP这边你只需要阅读HTTP使用的方法,这样你就可以根据它来采取行动了。

有很多可用的库可以为您做到这一点。

使用来自 PHP 的 PUT 数据的方法:

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