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

时间:2015-01-14 10:53:58

标签: php http http-delete http-put http-options-method

简介

我已阅读以下内容:

  

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

     

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

咦?

好吧,我们已经忘记了事情。

他们说,

PUTDELETE。我只听说过POSTGET,从来没有看到$_PUT$_DELETE之类的东西在我见过的任何PHP代码中传递过。

我的问题

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

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

5 个答案:

答案 0 :(得分:43)

  

......

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

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

该协议基本上说明了这一点:

    当您需要访问资源并检索数据时,
  • 使用 GET ,并且您不必修改或更改此数据的状态

  • 当您需要发送一些数据到服务器时,
  • 使用 POST 。防爆。从表单中将这些数据保存到某个地方。

  • 当您需要访问资源并仅从响应中检索标题时,使用 HEAD ,而不需要任何资源数据。

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

  • 在您需要删除资源(相对于您已发送的URI)时,使用删除

    < / LI> 当您需要从资源获取通信选项时,
  • 使用 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请求中获取参数并将它们插入到超全局(可访问的应用程序中)数组中。因此,您可以访问返回&#39; aparameter`的$_GET['maybe']

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

POST /something/index.php

(body) maybe=aparameter

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

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

答案 1 :(得分:22)

使用PHP的PUT数据的方法:

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

答案 2 :(得分:10)

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

使用查询字符串参数不仅限于GET请求,而且只有POST的其他类型的请求可以附带请求正文。

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

答案 3 :(得分: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方法,以便您可以根据该方法采取行动。

有很多库可供您使用。

答案 4 :(得分:9)

  

这些方法是什么(PUT)和(删除)

described in the HTTP spec

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

  

从来没有看到$_PUT$_DELETE之类的东西在我曾经查看的任何PHP代码中传递

$_POST$_GET非常名为superglobals。 $_POST用于从请求正文解析的数据。 $_GET用于从URL解析的数据。没有什么可以将这些地方(特别是URL)中的数据严格地绑定到特定的请求方法。

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

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

  

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

您需要将URL映射到PHP脚本(例如使用URL rewriting),test the request method,找出what URL you were actually dealing with,然后编写代码以执行相应的操作