HTTP协议的PUT和DELETE以及它们在PHP中的用法

问题描述 投票:46回答:5

Introduction

我读过以下内容:

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

HTTP谓词构成了我们“统一接口”约束的主要部分,并为我们提供了与基于名词的资源相对应的动作。主要或最常用的HTTP谓词(或方法,因为它们被正确调用)是POST,GET,PUT和DELETE。

Huh?

好吧,我们突然忘记了事情。

他们说,PUTDELETE。我只听说过POSTGET,从来没有看过像我曾经看过的任何PHP代码中的$_PUT$_DELETE

My question

这些方法(PUT)和(DELETE)是什么,如果可以在PHP中使用它们,我将如何解决这个问题。

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

php http http-delete http-put http-options-method
5个回答
43
投票

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

有很多词要用来解释这个,而且我没有足够的技巧去做,但正如已经发布的那样,快速回顾一下HTTP specification所描述的内容。

该协议基本上说:

  • 当您需要访问资源并检索数据时使用GET,而您不必修改或更改此数据的状态。
  • 需要将一些数据发送到服务器时使用POST。防爆。从表单中将这些数据保存到某处。
  • 当您需要访问资源并从响应中仅检索Headers而不使用任何资源数据时,请使用HEAD。
  • 当您需要替换该系统上已存在的某些数据的状态时,请使用PUT。
  • 当您需要删除该系统上的资源(相对于您发送的URI)时,请使用DELETE。
  • 当您需要从资源获取通信选项时使用OPTIONS,以便检查该资源的允许方法。防爆。我们将它用于CORS请求和权限规则。
  • 您可以阅读该文档中剩余的两种方法,抱歉我从未使用过它。

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


...如果可以在PHP中使用它们,我将如何解决这个问题。

从您的应用程序中,您应该检索与$_SERVER['REQUEST_METHOD']一起使用的方法,并因此做出反应。

一些处理不支持PUT或DELETE方法的浏览器的应用程序使用这个技巧,一个来自html的隐藏字段,其值为ex。:

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

因此,从应用程序中,您现在可以将其识别为DELETE请求。


按照PHP处理参数的简单描述:

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

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

所以请求应该如下所示:

GET /something/index.php?maybe=aparameter

现在,在您的应用程序中,PHP从此GET请求中获取参数并将它们插入到超全局(可访问的应用程序中)数组中。所以你可以访问返回'aparameter`的$_GET['maybe']

在POST请求的情况下,您以类似的方式向HTTP服务器请求资源但具有重要区别。您在请求正文中提供数据:

POST /something/index.php

(body) maybe=aparameter

现在,在您的应用程序中,来自此POST请求的PHP获取参数并将它们插入到超全局(可访问的应用程序中)数组中。所以你可以访问返回'aparameter`的$_POST['maybe']

请特别注意响应状态代码(例如,如果您收到了PUT请求并且您已经更新了该资源而没有错误,则应该返回204状态 - 无内容 - )。


28
投票

从PHP使用PUT数据的方法:

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

11
投票

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

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

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


10
投票

最适合使用这些(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方法,以便你可以根据它采取行动。

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


9
投票

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

described in the HTTP spec

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

从来没有看到像$_PUT$_DELETE在我看过的任何PHP代码中路过的东西

$_POST$_GET非常名为superglobals。 $_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,然后编写代码以执行相应的操作。

© www.soinside.com 2019 - 2024. All rights reserved.