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

Posted

技术标签:

【中文标题】HTTP 协议的 PUT 和 DELETE 及其在 PHP 中的使用【英文标题】:HTTP protocol's PUT and DELETE and their usage in PHP 【发布时间】:2015-03-12 12:49:24 【问题描述】:

简介

我已阅读以下内容:

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

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

嗯?

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

PUTDELETE,他们说。我只听说过POSTGET,从未在我看过的任何php 代码中看到过$_PUT$_DELETE

我的问题

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

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

【问题讨论】:

(有趣的问题。除此之外:如果您在网站或书籍的片段中发帖,引用它会有所帮助,以表明它不是您的文字而是其他人的文字。这增加了上下文,使问题更具可读性)。 【参考方案1】:

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

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

协议基本上是这样说的:

当您需要访问资源和检索数据时使用 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 状态 -没有内容-).

【讨论】:

问题问如何使用PUT和DELETE,这个答案解释了如何使用GET和POST 谢谢,您的评论部分正确,我已经更新了答案。【参考方案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 

【讨论】:

[PHP 手册]:php.net/manual/en/features.file-upload.put-method.php 建议在此答案中针对 PUT 请求使用该技术。我找不到 DELETE 请求的手册页,并且发现我只能从查询字符串 ($_GET) 而不是任何类型的流(如 php://input)中检索数据。 PHP 手册页提到更新服务器配置(特别是 Apache),但 CentOS7/PHP7/httpd2.4.6 没有必要。 该死的,2018 年了。为什么 PHP 还没有直接支持 PUT。 @Roman ikr,2020 年在这里,经过数小时的搜索,终于找到了这个。这是没有框架的 PUT 或更新操作的最佳 RESTful 解析。非常感谢安德烈!【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

有described in the HTTP spec。

简单地说,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 rewriting)、test the request method、计算出what URL you were actually dealing with,然后编写代码来执行相应的操作。

【讨论】:

我会谨慎地说上传和删除“文件”。从技术上讲,它会影响由 URI(又名 URL)标识的“资源”,它可能是也可能不是物理文件。通常在 REST 场景中,这通常是指数据库实体。 RFC 2616 已过时。请引用 RFC 7231。

以上是关于HTTP 协议的 PUT 和 DELETE 及其在 PHP 中的使用的主要内容,如果未能解决你的问题,请参考以下文章

解析HTTP协议六种请求方法,get,head,put,delete,post有啥区别

在web前端怎么发送http协议的put delete请求

HTTP协议六种请求方法,get,head,put,delete,post有什么区别

http中get,post,put,delete方法的用法以及区别

Http协议[Get和Post]详解

[轻微]WEB服务器启用了OPTIONS方法/如何禁止DELETE,PUT,OPTIONS等协议访问应用程序/tomcat下禁用不安全的http方法