recibir por funciona enviar ejemplo datos _request _post php rest post

por - ¿Cómo obtener el cuerpo de un POST en PHP?



php post request (6)

Presento como POST a una página php lo siguiente:

{a:1}

Este es el cuerpo de la solicitud (una solicitud POST).
En PHP, ¿qué tengo que hacer para extraer ese valor?

var_dump($_POST);

No es la solución, no funciona.



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 constante STDIN es un flujo ya abierto a php://input , por lo que alternativamente puedes hacer:

$entityBody = stream_get_contents(STDIN);

Desde la entrada del manual de PHP en documentos de secuencias 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_DATA ya que no depende de directivas especiales php.ini. Además, para aquellos casos en los que $HTTP_RAW_POST_DATA no se llena de forma predeterminada, es una alternativa potencialmente menos intensiva de memoria para activar always_populate_raw_post_data. php: // input no está disponible con enctype = "multipart / form-data".

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

Para mantener el recurso de flujo, algo como esto puede ser ú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://temp permite administrar el consumo de memoria porque cambiará de manera transparente al almacenamiento del sistema de archivos después de que se almacene una cierta cantidad de datos (2M por defecto). Este tamaño se puede manipular en el archivo php.ini o agregando /maxmemory:NN , donde NN es la cantidad máxima de datos para mantener en la memoria antes de usar un archivo temporal, en bytes.

Por supuesto, a menos que tenga una buena razón para buscar en el flujo de entrada, no debería necesitar esta funcionalidad en una aplicación web. Por lo general, leer el cuerpo de la entidad de solicitud HTTP es suficiente: no haga que los clientes esperen todo el día mientras su aplicación descubre qué hacer.

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


Si ha instalado la extensión HTTP PECL, puede hacer uso de la función http_get_request_body() para obtener datos del cuerpo como una cadena.


Si tiene instalada la extensión pecl/http , también puede usar esto:

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


Una posible razón para un $_POST vacío es que la solicitud no es POST , o ya no POST ... ¡Puede haber comenzado como publicación, pero se encontró con un redireccionamiento 301 o 302 algún lugar, que se requiere para cambiar a GET !

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