72

介绍

我已阅读以下内容:

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

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

嗯?

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

PUT并且DELETE,他们说。在我看过的任何 PHP 代码中,我只听说过POST并且GET从未见过类似$_PUT$_DELETE经过的东西。

我的问题

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

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

4

5 回答 5

66

这些方法 (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-)

于 2015-01-14T14:00:49.910 回答
40

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

$method = $_SERVER['REQUEST_METHOD'];
if ('PUT' === $method) {
    parse_str(file_get_contents('php://input'), $_PUT);
    var_dump($_PUT); //$_PUT contains put fields 
}
于 2017-01-31T13:44:17.877 回答
19

PHP 的$_GET名称$_POST很差。$_GET用于访问查询字符串参数的值,并$_POST允许您访问请求正文。

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

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

于 2015-01-14T10:58:44.450 回答
12

最适合使用这些(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使用的方法,以便您可以根据该方法进行操作。

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

于 2015-01-19T10:27:12.397 回答
9

这些方法是什么(PUT)和(DELETE)

HTTP规范中有描述。

简而言之,并且有点简化,PUT是用于将文件上传到 URL 并DELETE用于从 URL 中删除文件。

从来没有在我看过的任何 PHP 代码中看到类似$_PUT或经过的东西$_DELETE

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

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

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

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

您需要将 URL 映射到 PHP 脚本(例如,使用URL 重写),测试请求方法,计算出您实际处理的 URL,然后编写代码来执行适当的操作。

于 2015-01-14T10:59:56.797 回答