Se me ha indicado usar el método php://input
en lugar de $_POST
al interactuar con las solicitudes Ajax de JQuery. Lo que no entiendo son los beneficios de usar este vs el método global de $_POST
o $_GET
.
Respuesta
La razón es que php://input
devuelve todos los datos sin procesar después de los encabezados HTTP de la solicitud, independientemente del tipo de contenido.
El PHP superglobal $_POST
, solamente se supone que datos envoltura que es ya sea
application/x-www-form-urlencoded
(tipo de contenido estándar para simples form-mensajes) omultipart/form-data-encoded
(utilizado principalmente para la carga de archivos)
Esto se debe a que estos son los únicos tipos de contenido que must be supported by user agents. Por lo tanto, el servidor y PHP tradicionalmente no esperan recibir ningún otro tipo de contenido (lo que no significa que no puedan).
Por lo tanto, si simplemente fije una buena vieja HTML form
, la solicitud se ve algo como esto:
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
Pero si se está trabajando con el Ajax mucho, este probaby también incluye el intercambio de datos más complejos con los tipos (cadena, int, bool) y estructuras (matrices, objetos), por lo que en la mayoría de los casos JSON es la mejor opción. Sin embargo, una solicitud con una carga útil de JSON-sería algo como esto:
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
El contenido sería ahora application/json
(o al menos ninguno de los anteriores mencionados), de modo de $_POST
PHP -wrapper no sabe cómo manejar eso (todavía).
La información sigue allí, simplemente no puede acceder a ella a través del contenedor. Por lo tanto, debe buscarlo usted mismo en formato sin formato con file_get_contents('php://input')
(as long as it's not multipart/form-data
-encoded).
Esta es también la forma en que accederá a datos XML o cualquier otro tipo de contenido no estándar.
php://input
puede darle los bytes brutos de los datos. Esto es útil si los datos POST son una estructura codificada JSON, que a menudo es el caso de una solicitud AJAX POST.
Aquí es una función de hacer precisamente eso:
/**
* Returns the JSON encoded POST data, if any, as an object.
*
* @return Object|null
*/
private function retrieveJsonPostData()
{
// get the raw POST data
$rawData = file_get_contents("php://input");
// this returns null if not valid json
return json_decode($rawData);
}
La matriz $_POST
es más útil cuando se está manejando los datos de valores clave de un formulario, presentado por un poste tradicional. Esto solo funciona si los datos POST están en un formato reconocido, generalmente application/x-www-form-urlencoded
(ver http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4 para más detalles).
Vale la pena señalar que si pasa 'true' como el segundo parámetro a' json_decode', devolverá una matriz asociativa. – VSG24
Si los datos de la publicación están mal formados, $ _POST no contendrá nada. Sin embargo, php: // input tendrá la cadena mal formada.
Por ejemplo, hay algunas aplicaciones ajax, que no forman la secuencia correcta de clave-valor de publicación para cargar un archivo, y simplemente vuelcan todo el archivo como datos de entrada, sin nombres de variables ni nada. $ _POST estará vacío, $ _FILES vacíos también, y la entrada php: // contendrá el archivo exacto, escrito como una cadena.
- 1. PHP $ _REQUEST $ _GET o $ _POST
- 2. PHP $ _POST obtener matriz de datos
- 3. PHP $ _POST y solo id, no name
- 4. Echo an $ _POST en PHP
- 5. Dónde desinfectar PHP $ _POST [] entrada?
- 6. ¿Cómo reenviar $ _POST con PHP y cURL?
- 7. PHP necesita recortar todas las variables $ _POST
- 8. PHP: $ _GET y $ _POST en funciones?
- 9. PHP carga - ¿Por isset ($ _POST [ 'submit']) siempre es FALSO
- 10. Publicación de IE8 a PHP da espacio en blanco $ _POST
- 11. PHP $ _POST está vacío en IE9 e IIS7
- 12. PHP array vs PHP Constant?
- 13. PHP - vacío $ _POST y $ _FILES - al cargar archivos más grandes
- 14. ASP.Net equivalente de PHP's file_get_contents ('php: // input');
- 15. php: // input - ¿Qué hace en fopen()?
- 16. $ _POST vs. $ _SERVER [ 'REQUEST_METHOD'] == 'post'
- 17. PHP preg_replace/preg_match vs PHP str_replace
- 18. PHP vs OO PHP - ¿Cuál usar?
- 19. nginx/apache/php vs nginx/php
- 20. Cómo imprimir_r $ _POST matriz?
- 21. Las variables PHP $ _POST a veces están vacías
- 22. ¿Por qué fusionarías $ _GET y $ _POST en PHP?
- 23. ¿Cómo pasar variable como $ _POST clave en PHP?
- 24. PHP: Cómo reemplazar en masa $ _POST [...] con strip_tags ($ _ POST [...])
- 25. ¿Por qué se escapan las variables $ _POST en PHP?
- 26. Sockets Php vs Streams
- 27. PHP: destructor vs register_shutdown_function
- 28. PHP Comentarios # vs //
- 29. PHP: get_class_vars() vs. get_object_vars()
- 30. php var_dump() vs print_r()
+1 para "Esta es también la forma en que accedería a XML-data o cualquier otro tipo de contenido no estándar" – mandza
@Quasdank Estoy enviando JSON desde la aplicación de Android al servidor php xampp en la nube (http://stackoverflow.com/ preguntas/36558261/json-enviado-desde-android-a-compute-engine-server-returns-null) pero no pude hacer que funcione cuando intenté file_get_contents ('php: // input'), que simplemente devuelve cadena (0). Esto solía funcionar en mi máquina local, pero no funciona cuando lo implementé en la nube. ¿Usted me podría ayudar por favor? –