¿Cómo obtener el cuerpo de un POST en php?

Resuelto Itay Moav -Malimovka asked hace 54 años • 9 respuestas

Envío como POST a una página php lo siguiente:

{a:1}

Este es el cuerpo de la solicitud (una solicitud POST).
En php que tengo que hacer para extraer ese valor?

var_dump($_POST); 

No es la solución, no funciona.

Itay Moav -Malimovka avatar Jan 01 '70 08:01 Itay Moav -Malimovka
Aceptado

Para acceder al cuerpo de la entidad de una solicitud POST o PUT (o cualquier otro método HTTP):

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

Además, la STDINconstante es una secuencia ya abierta para php://input, por lo que, alternativamente, puedes hacer:

$entityBody = stream_get_contents(STDIN);

De la entrada del manual de PHP en documentos de flujos de E/S :

php://input es una secuencia de solo lectura que le permite leer datos sin procesar del cuerpo de la solicitud. En el caso de solicitudes POST, es preferible utilizar php://input en lugar de, $HTTP_RAW_POST_DATAya que no depende de directivas especiales de php.ini. Además, para aquellos casos en los que $HTTP_RAW_POST_DATAno se completa de forma predeterminada, es una alternativa potencialmente menos intensiva en memoria que activar siempre_populate_raw_post_data. php://input no está disponible con enctype="multipart/form-data".

Específicamente, querrá tener en cuenta que la php://inputtransmisión, independientemente de cómo acceda a ella en un SAPI web, no se puede buscar . Esto significa que sólo se puede leer una vez. Si está trabajando en un entorno donde se cargan rutinariamente grandes cuerpos de entidades HTTP, es posible que desee mantener la entrada en su formato de flujo (en lugar de almacenarla en el búfer como en el primer ejemplo anterior).

Para mantener el recurso de transmisión, algo como esto puede resultar útil:

<?php

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

    return $tempStream;
}

php://temple permite administrar el consumo de memoria porque cambiará de forma transparente al almacenamiento del sistema de archivos después de almacenar una cierta cantidad de datos (2 M de forma predeterminada). Este tamaño se puede manipular en el archivo php.ini o agregando /maxmemory:NN, donde NNes la cantidad máxima de datos a mantener en la memoria antes de usar un archivo temporal, en bytes.

Por supuesto, a menos que tenga una muy buena razón para buscar en el flujo de entrada, no debería necesitar esta funcionalidad en una aplicación web. Leer el cuerpo de la entidad de solicitud HTTP una vez suele ser suficiente; no haga que los clientes esperen todo el día mientras su aplicación decide qué hacer.

Tenga en cuenta que php://input no está disponible para solicitudes que especifican un Content-Type: multipart/form-dataencabezado ( enctype="multipart/form-data"en formularios HTML). Esto se debe a que PHP ya ha analizado los datos del formulario en el formato $_POSTsuperglobal.

 avatar Jan 20 '2012 18:01

valor de retorno en matriz

 $data = json_decode(file_get_contents('php://input'), true);
umesh bhanderi avatar Mar 12 '2019 10:03 umesh bhanderi

Una posible razón para un vacío $_POSTes que la solicitud no es POST, o POSTya no... Es posible que haya comenzado como una publicación, pero encontró una redirección 301o en algún lugar, que se cambió a !302GET

Inspeccione $_SERVER['REQUEST_METHOD']para comprobar si este es el caso.

Consulte https://stackoverflow.com/a/19422232/109787 para obtener una buena discusión sobre por qué esto no debería suceder, pero aún así sucede.

Legolas avatar Mar 16 '2016 14:03 Legolas
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());
Hatzegopteryx avatar Nov 03 '2019 10:11 Hatzegopteryx

Este es un ejemplo de cómo crear una API de PHP file_get_contents("php://input")y javascriptusarla ajaxcon 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;
Vinci avatar May 01 '2021 01:05 Vinci