【问题标题】:get a PHP delete variable获取 PHP 删除变量
【发布时间】:2011-07-19 11:44:27
【问题描述】:

如果我发出 HTTP DELETE,我如何访问 PHP 主体/变量?我知道如果您发布 POST,您可以通过$_POST['varname'] 访问它,但是如果它是 DELETE 而不是 POST,您如何访问它?假设这里的 varname 是 ID。

【问题讨论】:

  • 它是stackoverflow.com/questions/1405505/…的副本,但我不知道答案是否对您有帮助。
  • 检查了,对我没有帮助
  • 您可以在$_GET 中获取变量。如果方法不是GETPOST,请求将作为GET方法发送
  • 我对 parse_str 的想法有一半是正确的,请参阅我的答案,以轻松解析来自 HTTP 请求正文的 PUTDELETE 请求变量。但是有一些限制。

标签: php


【解决方案1】:

您可能需要直接从php://input 流中读取数据。

我知道对于PUT 请求,您必须这样做,并且一些快速的谷歌搜索表明该方法也适用于DELETE

有关示例,请参阅 here。评论here 说这种方法也适用于DELETE

这是一个有趣的代码示例,将有所帮助(来自 symfony 1.4.9 框架的 sfWebRequest.class.php,为简洁起见略有改动):

public function initialize(...) 
{
  ... code ...

  $request_vars = array();
  if (isset($_SERVER['REQUEST_METHOD']))
  {
    switch ($_SERVER['REQUEST_METHOD'])
    {
      case 'PUT':
        if ('application/x-www-form-urlencoded' === $this->getContentType())
        {
          parse_str($this->getContent(), $request_vars );
        }
        break;

      case 'DELETE':
        if ('application/x-www-form-urlencoded' === $this->getContentType())
        {
          parse_str($this->getContent(), $request_vars );
        }
        break;
    }
  ... more code ...
}

public function getContent()
{
  if (null === $this->content)
  {
    if (0 === strlen(trim($this->content = file_get_contents('php://input'))))
    {
      $this->content = false;
    }
  }

  return $this->content;
}

此代码示例将PUTDELETE 请求参数放入$request_vars 数组中。一个限制似乎是表单(如果您使用其他内容类型标头)必须是“application/x-www-form-urlencoded”,一些快速谷歌搜索证实了这一点。

【讨论】:

  • 那么说做完之后,我可以通过$request_vars['id']访问它吗?
  • 是的,基本上。您将无法按原样使用代码,因为它是大型类的一部分,但它是您所追求的模板。
【解决方案2】:

file_get_contents('php://input') 应该始终为您提供完整的请求正文。请注意,它可能只能读取一次。更大的问题是 DELETE 请求是否可能包含正文,这似乎是 unanswered question,但可能会起作用。

我会说在正文中发送 id 有点 RESTless。相关实体应通过 URL 引用为 example.com/foo/42,因此 DELETE 请求应使用 DELETE /foo/42,而不是带有请求正文中 id 的 DELETE /foo

【讨论】:

  • 那么如何获取具体的变量名呢?我必须对它进行字符串解析吗?
【解决方案3】:

如上所述,PHP 确实没有有一个全局变量来快速访问DELETE 请求中的数据。为什么,我不知道;它可能没有像 GETPOST 那样被使用过。

您必须使用$_SERVER['REQUEST_METHOD'] 检查请求类型,然后使用php://input 流检索整个正文并从中提取数据。如果您想保持与您的代码类似的外观(假设您使用$_POST$_GET),您可以创建一个对每个请求执行此操作的函数并将其保存在名为$_DELETE 的全局变量中。您甚至可以修补您的 PHP 来执行此操作并编译您自己的 PHP 版本,但这当然会使试图在另一个 PHP 安装上运行您的代码的人感到困惑 :)

【讨论】:

    【解决方案4】:

    我认为您无法在全局可用的数组中访问它,但您可以确定请求类型,请参见此处:Detecting request type in PHP (GET, POST, PUT or DELETE)

    【讨论】:

    • 我可以检测到它就好了,我想得到 var。
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多