【问题标题】:file_get_contents('php://input') returning empty string with a PATCH requestfile_get_contents('php://input') 返回带有 PATCH 请求的空字符串
【发布时间】:2015-06-14 00:38:51
【问题描述】:

我的环境是PHP 5.5.9,Nginx 1.4.6-1ubuntu3.2,localhost。

我正在尝试从 PATCH 方法获取数据,但这只是返回一个空字符串... 使用 POST 方法可以正常工作,这是我的脚本的一部分:

case 'POST':
case 'PATCH':
     $this->data = file_get_contents("php://input");

$this->使用 PATCH 方法时数据为空,POST 时完成,我使用 POSTMAN chrome 扩展并推送 RAW 数据(不是 multipart/form-data)

我认为 Nginx 有问题...但日志文件中没有任何内容...

任何帮助将不胜感激!

【问题讨论】:

    标签: php rest nginx patch


    【解决方案1】:

    我最近在尝试访问 php://input 以获取 PUT 请求时遇到了类似的问题。问题只是我之前已经访问过一次(在相关代码之前运行的日志记录函数中)。

    POST 的行为与其他方法不同,这解释了差异:

    注意:在 PHP 5.6 之前,使用 php://input 打开的流只能读取一次;该流不支持查找操作。但是,根据 SAPI 实现,可能会打开另一个 php://input 流并重新开始读取。这只有在请求正文数据已保存时才有可能。通常,这是 POST 请求的情况,但不是其他请求方法,例如 PUT 或 PROPFIND。

    来源:http://php.net/manual/en/wrappers.php.php

    解决方案很简单:将 php://input 的值从初始抓取存储到 PHP 变量,并且不要尝试为非 POST 请求多次运行 file_get_contents("php://input")

    【讨论】:

    • 非常感谢您的建议,它帮助我解决了我的问题。我想补充一点,您不仅必须阅读一次,而且似乎您必须开始阅读流作为脚本中的第一件事。首先,我在阅读 HTTP 标头后阅读了此内容,它适用于 POST 请求,但不适用于 PATCH。在读取 HTTP 标头之前移动 $requestJSONBody = file_get_contents('php://input'); 之后,它也开始为 PATCH 工作。
    猜你喜欢
    • 1970-01-01
    • 2015-01-24
    • 2014-02-11
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2011-05-09
    相关资源
    最近更新 更多