file_get_contents ("php: // input") o $ HTTP_RAW_POST_DATA, ¿cuál es mejor para obtener el cuerpo de la solicitud JSON?

120

file_get_contents("php://input")o $HTTP_RAW_POST_DATA- ¿cuál es mejor para obtener el cuerpo de la solicitud JSON?

¿Y qué tipo de solicitud ( GETo POST) debo usar para enviar datos JSON cuando uso el lado del cliente XmlHTTPRequest?

Mi pregunta se inspiró en esta respuesta: Cómo publicar JSON en PHP con curl

Cita de esa respuesta:

Desde la perspectiva del protocolo, en file_get_contents("php://input")realidad es más correcto, ya que de todos modos no está procesando datos de formularios http multiparte.

Manuel Bitto
fuente

Respuestas:

195

De hecho, le php://inputpermite leer datos POST sin procesar.

Es una alternativa que consume menos memoria que $ HTTP_RAW_POST_DATA y no necesita ninguna directiva php.ini especial .

php://inputno está disponible con enctype="multipart/form-data".

Referencia: http://php.net/manual/en/wrappers.php.php

zaf
fuente
12
Además, a partir de PHP 5.6, $HTTP_RAW_POST_DATAse considera obsoleto y php://inputse puede reutilizar.
Chris Forrence
También vea enable_post_data_reading.
Pacerier
json_decode (file_get_contents ('php: // input'), true) ¿Esto es compatible con PHP 7.1 para obtener valores $ _GET de la URL?
Kailas
$ HTTP_RAW_POST_DATA ha quedado obsoleto a partir de PHP 7
Daniel
15

php: // input es un flujo de solo lectura que le permite leer datos sin procesar del cuerpo de la solicitud. En el caso de las solicitudes POST, es preferible usar php: // input en lugar de $ HTTP_RAW_POST_DATA ya que no depende de directivas php.ini especiales . Además, para aquellos casos en los que $ HTTP_RAW_POST_DATA no se rellena de forma predeterminada, es una alternativa potencialmente menos intensiva en memoria que la activación de always_populate_raw_post_data.

Fuente: http://php.net/manual/en/wrappers.php.php .

Zeeshan Hyder
fuente
4
Además, a partir de PHP 5.6, $HTTP_RAW_POST_DATAse considera obsoleto y php://inputse puede reutilizar.
Chris Forrence
14

file_get_contents (php: // input): obtiene los datos POST sin procesar y debe usarlos cuando escribe API y necesita una entrada XML / JSON / ... que no se puede decodificar en $ _POST por PHP, algún ejemplo:

enviar por correo JSON cadena

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));
zloctb
fuente
3

Deben aplicarse las reglas habituales sobre cómo enviar la solicitud. Si la solicitud es para recuperar información (por ejemplo, un resultado de "sugerencia" de búsqueda parcial, o una nueva página que se mostrará, etc.), puede utilizar GET. Si los datos que se envían son parte de una solicitud para cambiar algo (actualizar una base de datos, eliminar un registro, etc.), utilice POST.

En el lado del servidor, no hay razón para usar la entrada sin procesar, a menos que desee tomar todo el bloque de publicación / obtención de datos de una sola vez. Puede recuperar la información específica que desee a través de las matrices _GET / _POST como de costumbre. Las bibliotecas AJAX como MooTools / jQuery manejarán la parte difícil de realizar las llamadas AJAX reales y codificar los datos del formulario en los formatos adecuados para usted.

Marc B
fuente
Ese es el punto: quiero tomar la publicación completa / obtener el bloque de datos de una sola vez, porque JSON es un formato sin variables, representa solo los datos.
Manuel Bitto
@Kucebe No veo por qué esto es necesario, ¿por qué no poner los datos JSON en un campo POST y terminar?
Pekka
Si desea el bloque JSON completo, ¿por qué no asignar el bloque de texto JSON a un campo de formulario y enviarlo así? <input type="hidden" name="data" value="json data here" />es completamente aceptable y le permite recuperarlo trivialmente del lado del servidor con $ _REQUEST ['data'].
Marc B
3
Incrustar JSON en un campo POST anula el propósito de la etiqueta de tipo de contenido HTTP y no es tan bueno para la depuración en Fiddler y los depuradores del navegador (que pueden entender JSON). Además, muchas bibliotecas de JavaScript de terceros PUBLICAN cargas útiles JSON como application / json.
CyberMonk
2

Para los datos JSON, es mucho más fácil PUBLICARLO como tipo de contenido "application / json". Si usa GET, debe codificar en URL el JSON en un parámetro y es un poco complicado. Además, no hay límite de tamaño cuando haces POST. El tamaño de GET es muy limitado (4K como máximo).

Codificador ZZ
fuente
2
A menudo hay un límite de tamaño para POST, pero generalmente es bastante alto. Compruebe su php.ini.
Brad
2

Su segunda pregunta es fácil, GET tiene un límite de tamaño de 1-2 kilobytes tanto en el servidor como en el navegador, por lo que cualquier tipo de grandes cantidades de datos tendría que enviar a través de POST.

Pekka
fuente