从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题

Posted

技术标签:

【中文标题】从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题【英文标题】:Issue reading HTTP request body from a JSON POST in PHP [duplicate] 【发布时间】:2011-10-26 05:55:45 【问题描述】:

我正在编写一个注册为 webhook 端点的脚本。我知道它已成功注册,因为我正在将每个请求的标头写入我的服务器日志。这是一个示例:

Content-Type: text/xml; charset=UTF-8
User-Agent: Jakarta Commons-HttpClient/3.1
Host: ==obfuscated== 
Content-Length: 1918

我注册的 API 将一个 JSON 对象发布到我的脚本中,我想使用 php 解析该对象。从请求头中可以看到,有一个漂亮的大 JSON 对象等待解析。这似乎很简单,但事实并非如此。

起初我尝试使用$_POST['json'] 或只是$_POST,但由于数据不在数组中,我不太确定如何访问它。

我尝试过使用file_get_contents('php://input')fopen('php://input', 'r')json_decode(),但没有运气。我无法使用http_get_request_body(),因为我所在的服务器没有 PECL,这超出了我的控制范围。

还有其他方法可以与我缺少的 POST-ed JSON 对象进行交互吗?谢谢!

【问题讨论】:

JSON 正文的内容类型错误,因此它可能已被删除。但是试试$HTTP_RAW_POST_DATA @mario 我以前见过这个变量,但不知道如何使用它。 json_decode($HTTP_RAW_POST_DATA);没用 参见手册页。需要先在php.ini 中启用。您还尝试过正确的 MIME 类型吗?有没有机会启用 mod_security? 【参考方案1】:

即使以下内容有效。

$inputJSON = file_get_contents('php://input');

如果您想继续使用 $_POST 将数据作为 FormData 发送

var fd = new FormData();
fd.append('key', 'value');
return axios.post('url', fd)

【讨论】:

【参考方案2】:

感谢其他人的意见。原来我只是需要

$inputJSON = file_get_contents('php://input');
$input = json_decode($inputJSON, TRUE); //convert JSON into array

json_decode 中的第二个参数将对象作为数组返回。

希望这对其他人有帮助!

【讨论】:

也适合我。简直不敢相信 PHP 无法识别 JSON 数据。我知道它毕竟是原始数据类型,但仍然...... $_POST 仅在收到带有 application/x-www-form-urlencodedmultipart/form-data Content-Type 标头的请求正文时填充值。由于 PHP 请求正文的流性质,您将在$_POST 输入流中获取数据,而不是两者。

以上是关于从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 读取 JSON POST

PHP REST 服务中的 JSON 格式问题从 AFNetworking 2.0 接收 POST

如何从 php 中的 JSON 对象数组中删除值?

jQuery 与 JSON

在php中读取json输入

在 PHP 中使用“POST”通过 C# 中的 JSON 检索数据库信息