0

Alibaba Cloud Function Compute で 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 メソッドによって送信された値を配信するために使用することはできません。期待どおりに機能しませんでした - 結果は空のままです。

その理由は、基盤となるテクノロジーにあります。Alibaba Cloud Function Compute は、イベント駆動型の React PHP ライブラリを使用してリクエストを処理します (これは、$requestオブジェクトを分析することで確認できます)。したがって、$_POST配列は空であり、「POST データを取得する簡単な方法」はありません。

幸いなことに、Alibaba の Function Compute ハンドラーは、本体のコンテンツを次$request->getBody()->getContents();のような文字列として提供します。

"bar=lala&foo=bar"

したがって、ソリューションは最初に考えたよりも簡単に思えます。たとえば、PHP 独自のparse_str()関数を使用できます。

$data = [];
$body = $request->getBody()->getContents();
parse_str($body,$data);

このスニペットをハンドラー関数に配置すると、POST 変数が$data配列に格納され、さらに処理できるようになります。

これが私と同じ質問をした人の助けになることを願っています:-)

敬具、ラルフ

4

2 に答える 2