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

简介

我读过以下内容:

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

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

啊?

好吧,我们到了这一步,我忘记了一些事情。

他们说是 PUTDELETE。我只听说过 POSTGET,从来没有见过像 $_PUT$_DELETE这样的东西在我看过的任何 PHP 代码中经过。

我的问题

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

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

97840 次浏览

PHP 的 $_GET$_POST命名不当。$_GET用于访问查询字符串参数的值,而 $_POST允许您访问请求体。

使用查询字符串参数不仅限于 GET 请求,而且除了 POST 之外,还有其他类型的请求可以与请求体一起使用。

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

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

在 HTTP 规范中描述

简而言之,简单来说,PUT用于将文件上传到 URL,而 DELETE用于从 URL 中删除文件。

从来没有看到像 $_PUT$_DELETE这样的东西经过任何 PHP 代码我曾经看过

$_POST$_GET被很糟糕地命名为超球体。$_POST用于从请求体解析的数据。$_GET用于从 URL 解析的数据。没有任何东西将这两个地方的数据(特别是 URL)严格地绑定到特定的请求方法。

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

PUT 请求通常关心您可以使用 file_get_contents('php://input');访问的整个请求主体(而不是它的解析版本)。

如果可以在 PHP 中使用它们,我该怎么做。

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

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

要解释这一点需要花费大量的语言,而且我没有足够的技能来做到这一点,但是正如已经发布的,快速回顾一下 HTTP 规范所描述的内容。

协议基本上是这么说的:

  • 使用 走开时,你需要 访问资源并检索数据,你不必修改或改变这个数据的状态。

  • 使用 职位时,你需要 发送一些数据到服务器。例如从一个表单保存这些数据的地方。

  • 使用 时,你需要 访问资源并从响应中仅检索 Header,没有任何资源数据。

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

  • 当您需要在该系统上使用 删除资源(相对于您发送的 URI)时,请使用 删除

  • 当需要从资源获取通信选项时,使用 选择,对于 检查该资源的允许方法如此。前女友。我们使用它的 CORS 请求和权限规则。

  • 您可以阅读该文档中剩余的两个方法,对不起,我从未使用过它。

基本上,协议是一组规则,您应该从应用程序中使用这些规则来遵守它。


如果可能的话 在 PHP 中使用它们,我该怎么做呢。

通过查看超全局数组 $_SERVER并检查字段 REQUEST_METHOD的值,可以从 php 应用程序中检索使用了哪个方法。

因此,从您的 php 应用程序中,您现在能够识别这是一个 DELETE 还是一个 PUT 请求,例如。$_SERVER['REQUEST_METHOD'] === 'DELETE'$_SERVER['REQUEST_METHOD'] === 'PUT'

* 还请注意,一些处理不支持 PUT 或 DELETE 方法的浏览器的应用程序使用了以下技巧,HTML 表单中的隐藏字段,其 value 属性中指定了谓词,例如:

<input name="_method" type="hidden" value="delete" />

接下来举一个例子,用一个简短的描述来说明处理这两个 http 请求的可能方法

当您(您的浏览器,您的客户端)向 HTTP 服务器请求资源时,您必须使用协议(HTTP)所接受的方法之一。所以你的请求必须通过:

  • 一种方法
  • 资源之源
  • 请求标题,如用户代理、主机、内容长度等
  • (请求的可选主体)

现在,虽然您可以使用各自的全局变量($_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 -)

最适合使用这些(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
}
$GLOBALS["_PUT"]=null;
if($_SERVER['REQUEST_METHOD'] == 'PUT') {
$form_data= json_encode(file_get_contents("php://input"));
$key_size=52;
$key=substr($form_data, 1, $key_size);
$acc_params=explode($key,$form_data);
array_shift($acc_params);
array_pop($acc_params);
foreach ($acc_params as $item){
$start_key=' name=\"';
$end_key='\"\r\n\r\n';
$start_key_pos=strpos($item,$start_key)+strlen($start_key);
$end_key_pos=strpos($item,$end_key);
        

$key=substr($item, $start_key_pos, ($end_key_pos-$start_key_pos));
        

$end_value='\r\n';
$value=substr($item, $end_key_pos+strlen($end_key), -strlen($end_value));
$_PUT[$key]=$value;
}
$GLOBALS["_PUT"]=$_PUT;
}


if (!function_exists("getParameter")){
function getParameter($parameter)
{
$value=null;
if(($_SERVER['REQUEST_METHOD'] == 'POST')&& (isset($_POST[$parameter]))){
$value=$_POST[$parameter];
}
else if(($_SERVER['REQUEST_METHOD'] == 'PUT')&& (isset($GLOBALS["_PUT"][$parameter])))
{
$value=$GLOBALS["_PUT"][$parameter];
}
else if(($_SERVER['REQUEST_METHOD'] == 'DELETE')&& (isset($_DELETE[$parameter]))){
$value=$_DELETE[$parameter];
}
else if(($_SERVER['REQUEST_METHOD'] == 'PATCH')&& (isset($_PATCH[$parameter]))){
$value=$_PATCH[$parameter];
}
else if(isset($_GET[$parameter])){
$value=$_GET[$parameter];
}
return $value;
}
}