我在阿里云函数计算上使用了 PHP 7.2 运行时和 HTTP 触发器。文档中的基本示例如下:
<? php
use RingCentral\Psr7\Response;
function handler($request, $context): Response{
/*
$body = $request->getBody()->getContents();
$queries = $request->getQueryParams();
$method = $request->getMethod();
$headers = $request->getHeaders();
$path = $request->getAttribute("path");
$requestURI = $request->getAttribute("requestURI");
$clientIP = $request->getAttribute("clientIP");
*/
return new Response(
200,
array(
"custom_header1" => "v1"
),
"hello world"
);
}
这工作得很好。从 URL 中获取查询参数很容易。但是正文内容仅在整个字符串中可用
$request->getBody()->getContents();
虽然文档说该$request
参数遵循 PSR-7 HTTP 消息标准,但不能$request->getParsedBody()
用于传递 POST 方法提交的值。它没有按预期工作 - 结果仍然是空的。
原因在于底层技术。阿里云函数计算使用事件驱动的 React PHP 库来处理请求(你可以通过分析$request
对象来检查)。所以$_POST
数组是空的,没有“获取 POST 数据的简单方法”。
幸运的是,阿里巴巴的函数计算处理程序以字符串形式提供正文内容,$request->getBody()->getContents();
例如
"bar=lala&foo=bar"
所以一个解决方案似乎比一开始想象的要容易,你可以使用 PHP 自己的parse_str()
函数:
$data = [];
$body = $request->getBody()->getContents();
parse_str($body,$data);
如果将此片段放在处理程序函数中,则 POST 变量将存储在$data
数组中并准备好进行进一步处理。
希望这可以帮助那些提出与我相同问题的人。:-)
亲切的问候,拉尔夫