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、PUT 和 DELETE。
嗯?
好吧,我们到了我忘记了事情的地步。
PUT
和 DELETE
,他们说。我只听说过POST
和GET
,从未在我看过的任何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有啥区别
HTTP协议六种请求方法,get,head,put,delete,post有什么区别
http中get,post,put,delete方法的用法以及区别
[轻微]WEB服务器启用了OPTIONS方法/如何禁止DELETE,PUT,OPTIONS等协议访问应用程序/tomcat下禁用不安全的http方法