How to get body of a POST in php?

PhpRestPost

Php Problem Overview


I submit as POST to a php page the following:

{a:1}

This is the body of the request (a POST request).
In php, what do I have to do to extract that value?

var_dump($_POST); 

is not the solution, not working.

Php Solutions


Solution 1 - Php

To access the entity body of a POST or PUT request (or any other HTTP method):

$entityBody = file_get_contents('php://input');

Also, the STDIN constant is an already-open stream to php://input, so you can alternatively do:

$entityBody = stream_get_contents(STDIN);

From the PHP manual entry on I/O streamsdocs:

> php://input is a read-only stream that allows you to read raw data > from the request body. In the case of POST requests, it is preferable > to use php://input instead of $HTTP_RAW_POST_DATA as it does not > depend on special php.ini directives. Moreover, for those cases where > $HTTP_RAW_POST_DATA is not populated by default, it is a potentially > less memory intensive alternative to activating > always_populate_raw_post_data. php://input is not available with > enctype="multipart/form-data".

Specifically you'll want to note that the php://input stream, regardless of how you access it in a web SAPI, is not seekable. This means that it can only be read once. If you're working in an environment where large HTTP entity bodies are routinely uploaded you may wish to maintain the input in its stream form (rather than buffering it like the first example above).

To maintain the stream resource something like this can be helpful:

<?php

function detectRequestBody() {
    $rawInput = fopen('php://input', 'r');
    $tempStream = fopen('php://temp', 'r+');
    stream_copy_to_stream($rawInput, $tempStream);
    rewind($tempStream);
    
    return $tempStream;
}

php://temp allows you to manage memory consumption because it will transparently switch to filesystem storage after a certain amount of data is stored (2M by default). This size can be manipulated in the php.ini file or by appending /maxmemory:NN, where NN is the maximum amount of data to keep in memory before using a temporary file, in bytes.

Of course, unless you have a really good reason for seeking on the input stream, you shouldn't need this functionality in a web application. Reading the HTTP request entity body once is usually enough -- don't keep clients waiting all day while your app figures out what to do.

Note that php://input is not available for requests specifying a Content-Type: multipart/form-data header (enctype="multipart/form-data" in HTML forms). This results from PHP already having parsed the form data into the $_POST superglobal.

Solution 2 - Php

return value in array

 $data = json_decode(file_get_contents('php://input'), true);

Solution 3 - Php

A possible reason for an empty $_POST is that the request is not POST, or not POST anymore... It may have started out as post, but encountered a 301 or 302 redirect somewhere, which is switched to GET!

Inspect $_SERVER['REQUEST_METHOD'] to check if this is the case.

See https://stackoverflow.com/a/19422232/109787 for a good discussion of why this should not happen but still does.

Solution 4 - Php

function getPost()
{
    if(!empty($_POST))
    {
        // when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
        // NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
        return $_POST;
    }
    
    // when using application/json as the HTTP Content-Type in the request 
    $post = json_decode(file_get_contents('php://input'), true);
    if(json_last_error() == JSON_ERROR_NONE)
    {
        return $post;
    }
    
    return [];
}

print_r(getPost());

Solution 5 - Php

This is an exemple of how to create a php api with file_get_contents("php://input") and used in javascript using ajax with XMLHttpRequest.

var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
    console.log("done");
            }
        }
    };
    xhttp.open("POST", "http://127.0.0.1:8000/api.php", true);
    xhttp.send(JSON.stringify({
        username: $(this).val(),
        email:email,
        password:password
    }));

$data = json_decode(file_get_contents("php://input"));
$username  =  $data->username;
$email  =   $data->email;
$password  =   $data->password;

Solution 6 - Php

If you have installed HTTP PECL extension, you can make use of the http_get_request_body() function to get body data as a string.

Solution 7 - Php

Solution 8 - Php

If you have the pecl/http extension installed, you can also use this:

$request = new http\Env\Request();
$request->getBody();

Solution 9 - Php

http_get_request_body() was explicitly made for getting the body of PUT and POST requests as per the documentation http://php.net/manual/fa/function.http-get-request-body.php

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionItay Moav -MalimovkaView Question on Stackoverflow
Solution 1 - PhprdlowreyView Answer on Stackoverflow
Solution 2 - Phpumesh bhanderiView Answer on Stackoverflow
Solution 3 - PhpLegolasView Answer on Stackoverflow
Solution 4 - PhpHatzegopteryxView Answer on Stackoverflow
Solution 5 - PhpL3xpertView Answer on Stackoverflow
Solution 6 - Phpshivanshu patelView Answer on Stackoverflow
Solution 7 - PhplinepoglView Answer on Stackoverflow
Solution 8 - PhpspinkusView Answer on Stackoverflow
Solution 9 - PhpYehuda SchwartzView Answer on Stackoverflow