Я играл с PHP 7.2 и триггером HTTP в облачной функции Alibaba. Основной пример в документации следующий:
<? 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
соответствует стандарту HTTP-сообщения PSR-7, невозможно использовать $request->getParsedBody()
для доставки значений, переданных методом POST. Это не сработало, как ожидалось - результат остается пустым.
Причина - основная технология. Облачная функция Alibaba Cloud Compute использует управляемую событиями библиотеку React PHP для обработки запросов (это можно проверить, проанализировав объект $request
). Таким образом, массив $_POST
пуст и нет "простого способа получить данные POST" .
К счастью, обработчик функциональных вычислений Alibaba обеспечивает содержание тела $request->getBody()->getContents();
в виде строки, подобной
"bar=lala&foo=bar"
Таким образом, решение кажется проще, чем предполагалось в начале, вы можете, например, использовать собственную функцию PHP parse_str()
:
$data = [];
$body = $request->getBody()->getContents();
parse_str($body,$data);
Если вы поместите этот фрагмент в функцию-обработчик, переменные POST будут сохранены в массиве $data
и готовы к дальнейшей обработке.
Надеюсь, что это поможет кому-то, кто задавал те же вопросы, что и я: -)
С уважением,
Ralf