从 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-urlencoded
或 multipart/form-data
Content-Type 标头的请求正文时填充值。由于 PHP 请求正文的流性质,您将在$_POST
或输入流中获取数据,而不是两者。以上是关于从 PHP 中的 JSON POST 读取 HTTP 请求正文的问题的主要内容,如果未能解决你的问题,请参考以下文章