Q&A: How to get POST variables with PHP on Alibaba Cloud Function Compute service












0














I played around with the PHP 7.2 runtime and HTTP trigger on Alibaba Cloud Function Compute. The basic example in the documentation is the following:



<? php
use RingCentralPsr7Response;
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"
);
}


This works quite well. It's easy to get the query parameters from an URL. But the body content is only available in a whole string with



$request->getBody()->getContents();


Although the documentation says that the $request parameter follows the PSR-7 HTTP Message standard, it is not possible to use $request->getParsedBody() to deliver the values submitted by POST method. It didn't work as expected - the result remains empty.



The reason is the underlying technology. Alibaba Cloud Function Compute makes use of the event-driven React PHP library to handle the requests (you can check this by analyzing the $request object). So the $_POST array is empty and there is no "easy way to get POST data".



Luckily, Alibaba's Function Compute handler provides the body content by $request->getBody()->getContents(); as a string like



"bar=lala&foo=bar"


So a solution seems easiser than thought at the beginning, you can e.g. use PHP's own parse_str() function:



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


If you place this snippet in the handler function, the POST variables are stored in the $data array and ready for further processing.



Hope that this helps somebody who asked the same questions than I. :-)



Kind regards,
Ralf










share|improve this question



























    0














    I played around with the PHP 7.2 runtime and HTTP trigger on Alibaba Cloud Function Compute. The basic example in the documentation is the following:



    <? php
    use RingCentralPsr7Response;
    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"
    );
    }


    This works quite well. It's easy to get the query parameters from an URL. But the body content is only available in a whole string with



    $request->getBody()->getContents();


    Although the documentation says that the $request parameter follows the PSR-7 HTTP Message standard, it is not possible to use $request->getParsedBody() to deliver the values submitted by POST method. It didn't work as expected - the result remains empty.



    The reason is the underlying technology. Alibaba Cloud Function Compute makes use of the event-driven React PHP library to handle the requests (you can check this by analyzing the $request object). So the $_POST array is empty and there is no "easy way to get POST data".



    Luckily, Alibaba's Function Compute handler provides the body content by $request->getBody()->getContents(); as a string like



    "bar=lala&foo=bar"


    So a solution seems easiser than thought at the beginning, you can e.g. use PHP's own parse_str() function:



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


    If you place this snippet in the handler function, the POST variables are stored in the $data array and ready for further processing.



    Hope that this helps somebody who asked the same questions than I. :-)



    Kind regards,
    Ralf










    share|improve this question

























      0












      0








      0







      I played around with the PHP 7.2 runtime and HTTP trigger on Alibaba Cloud Function Compute. The basic example in the documentation is the following:



      <? php
      use RingCentralPsr7Response;
      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"
      );
      }


      This works quite well. It's easy to get the query parameters from an URL. But the body content is only available in a whole string with



      $request->getBody()->getContents();


      Although the documentation says that the $request parameter follows the PSR-7 HTTP Message standard, it is not possible to use $request->getParsedBody() to deliver the values submitted by POST method. It didn't work as expected - the result remains empty.



      The reason is the underlying technology. Alibaba Cloud Function Compute makes use of the event-driven React PHP library to handle the requests (you can check this by analyzing the $request object). So the $_POST array is empty and there is no "easy way to get POST data".



      Luckily, Alibaba's Function Compute handler provides the body content by $request->getBody()->getContents(); as a string like



      "bar=lala&foo=bar"


      So a solution seems easiser than thought at the beginning, you can e.g. use PHP's own parse_str() function:



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


      If you place this snippet in the handler function, the POST variables are stored in the $data array and ready for further processing.



      Hope that this helps somebody who asked the same questions than I. :-)



      Kind regards,
      Ralf










      share|improve this question













      I played around with the PHP 7.2 runtime and HTTP trigger on Alibaba Cloud Function Compute. The basic example in the documentation is the following:



      <? php
      use RingCentralPsr7Response;
      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"
      );
      }


      This works quite well. It's easy to get the query parameters from an URL. But the body content is only available in a whole string with



      $request->getBody()->getContents();


      Although the documentation says that the $request parameter follows the PSR-7 HTTP Message standard, it is not possible to use $request->getParsedBody() to deliver the values submitted by POST method. It didn't work as expected - the result remains empty.



      The reason is the underlying technology. Alibaba Cloud Function Compute makes use of the event-driven React PHP library to handle the requests (you can check this by analyzing the $request object). So the $_POST array is empty and there is no "easy way to get POST data".



      Luckily, Alibaba's Function Compute handler provides the body content by $request->getBody()->getContents(); as a string like



      "bar=lala&foo=bar"


      So a solution seems easiser than thought at the beginning, you can e.g. use PHP's own parse_str() function:



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


      If you place this snippet in the handler function, the POST variables are stored in the $data array and ready for further processing.



      Hope that this helps somebody who asked the same questions than I. :-)



      Kind regards,
      Ralf







      php reactphp alibaba-cloud alibaba-cloud-function-compute






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 19 '18 at 20:14









      Ralf GeschkeRalf Geschke

      11




      11
























          2 Answers
          2






          active

          oldest

          votes


















          0














          As you can see in the documentation you need to add a RequestBodyParserMiddleware as middleware to get a parsed PSR-7 request. It seems you didn't do that.



          Also keep in mind that only the Content-Types: application/x-www-form-urlencoded and multipart/form-data are supported here. So make sure the client need to send these headers so the request can be parsed. If it's another Content-Type you need to use another middleware.



          See: https://github.com/reactphp/http#requestbodyparsermiddleware for more information.



          I hope this helps!






          share|improve this answer





















          • Thanks for your answer, please have a look at my comment regarding the Alibaba Cloud runtime environment. Kind regards, Ralf
            – Ralf Geschke
            Nov 21 '18 at 12:47



















          0














          @legionth: I apologize that I didn't use the comment feature here, but my answer is too long. :-)
          Thanks a lot for your comments - the usage of RequestBodyParserMiddleware is a great solution if you can control the server code. But in the context of Alibaba Cloud Function Compute service this seems not possible. I tried to find out more information about the invocation process - here are my results:




          • Function Compute makes use of the Docker image defined in https://github.com/aliyun/fc-docker/blob/master/php7.2/run/Dockerfile .


          • In the build process they download a PHP runtime environment from https://my-fc-testt.oss-cn-shanghai.aliyuncs.com/php7.2.tgz . (I didn't find this on GitHub, but the code is public downloadable.)


          • A shell script start_server.sh starts a PHP-CGI binary and runs a PHP script server.php.



          In server.php a ReactHttpServer is started by:



          $server = new Server(function (ServerRequestInterface $request) {

          [...]

          });

          [...]

          $socket = new ReactSocketServer(sprintf('0.0.0.0:%s', $port), $loop);
          $server->listen($socket);

          $loop->run();


          As seen in the Function Compute documentation (& example of FC console), I can only use two functions:



          /*
          if you open the initializer feature, please implement the initializer function, as below:
          */

          function initializer($context) {

          }


          and the handler function you can find in my first post.



          Maybe Alibaba will extend the PHP runtime in future to make it possible to use a custom middleware, but currently I didn't find a way to do this.



          Thanks again & kind regards,



          Ralf






          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381983%2fqa-how-to-get-post-variables-with-php-on-alibaba-cloud-function-compute-servic%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0














            As you can see in the documentation you need to add a RequestBodyParserMiddleware as middleware to get a parsed PSR-7 request. It seems you didn't do that.



            Also keep in mind that only the Content-Types: application/x-www-form-urlencoded and multipart/form-data are supported here. So make sure the client need to send these headers so the request can be parsed. If it's another Content-Type you need to use another middleware.



            See: https://github.com/reactphp/http#requestbodyparsermiddleware for more information.



            I hope this helps!






            share|improve this answer





















            • Thanks for your answer, please have a look at my comment regarding the Alibaba Cloud runtime environment. Kind regards, Ralf
              – Ralf Geschke
              Nov 21 '18 at 12:47
















            0














            As you can see in the documentation you need to add a RequestBodyParserMiddleware as middleware to get a parsed PSR-7 request. It seems you didn't do that.



            Also keep in mind that only the Content-Types: application/x-www-form-urlencoded and multipart/form-data are supported here. So make sure the client need to send these headers so the request can be parsed. If it's another Content-Type you need to use another middleware.



            See: https://github.com/reactphp/http#requestbodyparsermiddleware for more information.



            I hope this helps!






            share|improve this answer





















            • Thanks for your answer, please have a look at my comment regarding the Alibaba Cloud runtime environment. Kind regards, Ralf
              – Ralf Geschke
              Nov 21 '18 at 12:47














            0












            0








            0






            As you can see in the documentation you need to add a RequestBodyParserMiddleware as middleware to get a parsed PSR-7 request. It seems you didn't do that.



            Also keep in mind that only the Content-Types: application/x-www-form-urlencoded and multipart/form-data are supported here. So make sure the client need to send these headers so the request can be parsed. If it's another Content-Type you need to use another middleware.



            See: https://github.com/reactphp/http#requestbodyparsermiddleware for more information.



            I hope this helps!






            share|improve this answer












            As you can see in the documentation you need to add a RequestBodyParserMiddleware as middleware to get a parsed PSR-7 request. It seems you didn't do that.



            Also keep in mind that only the Content-Types: application/x-www-form-urlencoded and multipart/form-data are supported here. So make sure the client need to send these headers so the request can be parsed. If it's another Content-Type you need to use another middleware.



            See: https://github.com/reactphp/http#requestbodyparsermiddleware for more information.



            I hope this helps!







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 20 '18 at 14:31









            legionthlegionth

            363




            363












            • Thanks for your answer, please have a look at my comment regarding the Alibaba Cloud runtime environment. Kind regards, Ralf
              – Ralf Geschke
              Nov 21 '18 at 12:47


















            • Thanks for your answer, please have a look at my comment regarding the Alibaba Cloud runtime environment. Kind regards, Ralf
              – Ralf Geschke
              Nov 21 '18 at 12:47
















            Thanks for your answer, please have a look at my comment regarding the Alibaba Cloud runtime environment. Kind regards, Ralf
            – Ralf Geschke
            Nov 21 '18 at 12:47




            Thanks for your answer, please have a look at my comment regarding the Alibaba Cloud runtime environment. Kind regards, Ralf
            – Ralf Geschke
            Nov 21 '18 at 12:47













            0














            @legionth: I apologize that I didn't use the comment feature here, but my answer is too long. :-)
            Thanks a lot for your comments - the usage of RequestBodyParserMiddleware is a great solution if you can control the server code. But in the context of Alibaba Cloud Function Compute service this seems not possible. I tried to find out more information about the invocation process - here are my results:




            • Function Compute makes use of the Docker image defined in https://github.com/aliyun/fc-docker/blob/master/php7.2/run/Dockerfile .


            • In the build process they download a PHP runtime environment from https://my-fc-testt.oss-cn-shanghai.aliyuncs.com/php7.2.tgz . (I didn't find this on GitHub, but the code is public downloadable.)


            • A shell script start_server.sh starts a PHP-CGI binary and runs a PHP script server.php.



            In server.php a ReactHttpServer is started by:



            $server = new Server(function (ServerRequestInterface $request) {

            [...]

            });

            [...]

            $socket = new ReactSocketServer(sprintf('0.0.0.0:%s', $port), $loop);
            $server->listen($socket);

            $loop->run();


            As seen in the Function Compute documentation (& example of FC console), I can only use two functions:



            /*
            if you open the initializer feature, please implement the initializer function, as below:
            */

            function initializer($context) {

            }


            and the handler function you can find in my first post.



            Maybe Alibaba will extend the PHP runtime in future to make it possible to use a custom middleware, but currently I didn't find a way to do this.



            Thanks again & kind regards,



            Ralf






            share|improve this answer


























              0














              @legionth: I apologize that I didn't use the comment feature here, but my answer is too long. :-)
              Thanks a lot for your comments - the usage of RequestBodyParserMiddleware is a great solution if you can control the server code. But in the context of Alibaba Cloud Function Compute service this seems not possible. I tried to find out more information about the invocation process - here are my results:




              • Function Compute makes use of the Docker image defined in https://github.com/aliyun/fc-docker/blob/master/php7.2/run/Dockerfile .


              • In the build process they download a PHP runtime environment from https://my-fc-testt.oss-cn-shanghai.aliyuncs.com/php7.2.tgz . (I didn't find this on GitHub, but the code is public downloadable.)


              • A shell script start_server.sh starts a PHP-CGI binary and runs a PHP script server.php.



              In server.php a ReactHttpServer is started by:



              $server = new Server(function (ServerRequestInterface $request) {

              [...]

              });

              [...]

              $socket = new ReactSocketServer(sprintf('0.0.0.0:%s', $port), $loop);
              $server->listen($socket);

              $loop->run();


              As seen in the Function Compute documentation (& example of FC console), I can only use two functions:



              /*
              if you open the initializer feature, please implement the initializer function, as below:
              */

              function initializer($context) {

              }


              and the handler function you can find in my first post.



              Maybe Alibaba will extend the PHP runtime in future to make it possible to use a custom middleware, but currently I didn't find a way to do this.



              Thanks again & kind regards,



              Ralf






              share|improve this answer
























                0












                0








                0






                @legionth: I apologize that I didn't use the comment feature here, but my answer is too long. :-)
                Thanks a lot for your comments - the usage of RequestBodyParserMiddleware is a great solution if you can control the server code. But in the context of Alibaba Cloud Function Compute service this seems not possible. I tried to find out more information about the invocation process - here are my results:




                • Function Compute makes use of the Docker image defined in https://github.com/aliyun/fc-docker/blob/master/php7.2/run/Dockerfile .


                • In the build process they download a PHP runtime environment from https://my-fc-testt.oss-cn-shanghai.aliyuncs.com/php7.2.tgz . (I didn't find this on GitHub, but the code is public downloadable.)


                • A shell script start_server.sh starts a PHP-CGI binary and runs a PHP script server.php.



                In server.php a ReactHttpServer is started by:



                $server = new Server(function (ServerRequestInterface $request) {

                [...]

                });

                [...]

                $socket = new ReactSocketServer(sprintf('0.0.0.0:%s', $port), $loop);
                $server->listen($socket);

                $loop->run();


                As seen in the Function Compute documentation (& example of FC console), I can only use two functions:



                /*
                if you open the initializer feature, please implement the initializer function, as below:
                */

                function initializer($context) {

                }


                and the handler function you can find in my first post.



                Maybe Alibaba will extend the PHP runtime in future to make it possible to use a custom middleware, but currently I didn't find a way to do this.



                Thanks again & kind regards,



                Ralf






                share|improve this answer












                @legionth: I apologize that I didn't use the comment feature here, but my answer is too long. :-)
                Thanks a lot for your comments - the usage of RequestBodyParserMiddleware is a great solution if you can control the server code. But in the context of Alibaba Cloud Function Compute service this seems not possible. I tried to find out more information about the invocation process - here are my results:




                • Function Compute makes use of the Docker image defined in https://github.com/aliyun/fc-docker/blob/master/php7.2/run/Dockerfile .


                • In the build process they download a PHP runtime environment from https://my-fc-testt.oss-cn-shanghai.aliyuncs.com/php7.2.tgz . (I didn't find this on GitHub, but the code is public downloadable.)


                • A shell script start_server.sh starts a PHP-CGI binary and runs a PHP script server.php.



                In server.php a ReactHttpServer is started by:



                $server = new Server(function (ServerRequestInterface $request) {

                [...]

                });

                [...]

                $socket = new ReactSocketServer(sprintf('0.0.0.0:%s', $port), $loop);
                $server->listen($socket);

                $loop->run();


                As seen in the Function Compute documentation (& example of FC console), I can only use two functions:



                /*
                if you open the initializer feature, please implement the initializer function, as below:
                */

                function initializer($context) {

                }


                and the handler function you can find in my first post.



                Maybe Alibaba will extend the PHP runtime in future to make it possible to use a custom middleware, but currently I didn't find a way to do this.



                Thanks again & kind regards,



                Ralf







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 21 '18 at 12:45









                Ralf GeschkeRalf Geschke

                11




                11






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53381983%2fqa-how-to-get-post-variables-with-php-on-alibaba-cloud-function-compute-servic%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    MongoDB - Not Authorized To Execute Command

                    in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith

                    Npm cannot find a required file even through it is in the searched directory