2010-04-28 12 views
93

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 (GET o POST) debo usar para enviar datos JSON al usar el lado del cliente XmlHTTPRequest?

Mi pregunta fue inspirada de esta respuesta: How to post JSON to PHP with curl

Dice:

Desde una perspectiva protocolo file_get_contents("php://input") es en realidad más correcta, ya que no está realmente el procesamiento http datos del formulario de varias partes de todos modos.

+1

¿Recibió la respuesta que necesitaba? ;-) – maraspin

+3

@maraspin - Supongo que no, porque no ha aceptado una respuesta ;-) – Ben

Respuesta

164

En realidad, php://input le permite leer datos de POST sin formato.

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

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

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

+9

Nunca escuché de este método para recuperar datos, ¡excelente respuesta! – Jordy

+10

Además, a partir de PHP 5.6, '$ HTTP_RAW_POST_DATA' se considera obsoleto, y' php: // input' se puede reutilizar. –

+0

Ver también ['enable_post_data_reading'] (http://stackoverflow.com/a/12777947/632951). – Pacerier

2

Su segunda pregunta es fácil, GET tiene una limitación de tamaño de 1-2 kilobytes tanto en el servidor como en el navegador, por lo que cualquier tipo de cantidades de datos mayores que debería enviar a través de POST.

3

Las reglas habituales deben aplicarse para la forma de enviar la solicitud. Si la solicitud es para recuperar información (por ejemplo, un resultado de búsqueda indirecta parcial, o una nueva página para mostrar, etc.), puede usar 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.) luego usar POST.

En el lado del servidor, no hay ninguna razón para usar la entrada sin formato, a menos que desee tomar todo el bloque de entrada/obtener 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 de AJAX como MooTools/jQuery manejarán la parte difícil de hacer las llamadas AJAX reales y la codificación de los datos del formulario en los formatos adecuados para usted.

+0

Ese es el punto: quiero tomar todo el bloque de entrada/obtener datos de una sola vez, porque JSON es una variable-menos formato, representa solo los datos. –

+0

@Kucebe No veo por qué es necesario, ¿por qué no poner los datos JSON en un campo POST y terminar con ellos? –

+0

Si desea el bloque completo JSON, ¿por qué no asignar el bloque de texto JSON a un campo de formulario y enviarlo así? '' es completamente aceptable y le permite recuperarlo trivialmente del lado del servidor con $ _REQUEST ['data']. –

2

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

+2

A menudo hay un límite de tamaño para POST, pero generalmente se establece bastante alto. Compruebe su 'php.ini'. – Brad

10

php: // input es una de sólo lectura corriente que le permite leer los datos en bruto desde el cuerpo de la petición. En el caso de las solicitudes POST, es preferible usar la entrada php: // en lugar de $ HTTP_RAW_POST_DATA como , no depende de según las directivas especiales php.ini. Además, para los casos donde $ HTTP_RAW_POST_DATA no se completa de manera predeterminada, es una alternativa potencialmente menos memoria que a la activación de always_populate_raw_post_data.

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

+2

Además, a partir de PHP 5.6, '$ HTTP_RAW_POST_DATA' se considera obsoleto, y' php: // input' se puede reutilizar. –

7

file_get_contents (php: // input) - Obtiene los datos POST primas y hay que utilizar esta opción cuando se escribe API y la necesidad de XML/JSON/... de entrada que no puede ser decodificado a $ _POST por PHP algunos ejemplos:

enviar por la cadena posterior JSON

<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')); 
Cuestiones relacionadas