Para el ojo inexperto, era un día como cualquier otro. Nadie prestó atención a la poca luminosidad y la baja de temperatura, ya que se encontraba bien entrada la temporada de lluvias; un día nublado y frío era perfectamente natural.
Ese día, un formulario HTML, se alistó con su uniforme de CSS, tomó su Javascript y se fue a trabajar. Tenía una misión que cumplir, conectar con una API nueva hecha en PHP, enviarle una cadena JSON y evaluar la respuesta. Nada nuevo para el HTML, de hecho, esto era un trabajo bastante rutinario para él.
Puso manos a la obra, preparó el formulario. Con Javascript tomó los valores de los campos del formulario, preparó un fetch e inició la comunicación con la API.
Los mensajes comenzaron a fluir entre ellos. La API respondía que el mensaje del formulario era ininteligible. El HTML comenzó a agregar headers en su petición para que la API tuviera contexto del tema de la comunicación:

Habiendo recibido los headers, la API comenzó a comprender de qué se trataba el asunto, y por fin respondió como lo esperaba el HTML. Así que habiendo concretado la comunicación, el HTML inició las pruebas para emitir un JSON coherente. Lo creó con dos datos que había acordado con la API, este JSON debería darle una respuesta positiva. Aunque había que tenido que pasarlo por el método stringify, el JSON era hermoso.
Así pues, el HTML lo empaquetó y lo envió a la API. Todos lo vieron salir: el formulario, el HTML, Javascritp, el navegador web, el debugger del navegador web. Era como la inauguración de un barco que sale a la mar por primera vez. El mensaje JSON fue emitido a gran velocidad, en menos de un parpadeo se perdió de vista.
Unos instantes despues, el HTML recibe la respuesta de la API: -Mensaje recibo. Tus datos son incorrectos.

La cara de todos los presentes no podía evitar reflejar sorpresa y hasta cierto punto, molestia.
¿Qué es eso de ‘Tus datos son incorrectos’?
¿A qué está jugando la API? Ya habían hecho suficientes ejercicios de comunicación como para que entregara esa respuesta.
-Demos el beneficio de la duda, revisemos- Dijo el navegador web.
El HTML volvió a preparar el mensaje, se aseguró que el fecth creado por javascript fuera correcto. Pidió confirmación al debugger del navegador para verificar que los headers de la petición y su cuerpo estuvieran presentes y fueran correctos.
-Lista la petición- dijo el HTML.
-Headers y payload, completos y correctos- confirmó el navegador- Enviando…
El nuevo JSON se conformó y nuevamente lo vieron zarpar.
La respuesta de la API, no se hizo esperar:
-Mensaje recibo. Tus datos son incorrectos.
La frustración del HTML y el navegador eran evidentes -Incluso el narrador de esta crónica estaba ya en el punto de jalarse el pelo porque no entendía la situación.
-Vamos con la API, aquí todo está bien, veamos porqué responde que los datos son incorrectos- sugirió el HTML.
Así que el HTML y el Navegador fueron en busca de la API para conversar con ella y preguntar acerca del origen de su respuesta. Llegando con ella, tocaron a su puerta.
-¡Eh!, qué sorpresa, pero si es el nuevo cliente, y traes compañía. Pasen, Pasen.
Después de los habituales saludos, los visitantes expusieron el motivo de la visita, para no hacerle perder el tiempo a la API, que se veía, era un componente bastante ocupado.
-Y por eso hemos venido a verte, porque todo parece que está bien, pero tu respuesta es siempre que los datos son incorrectos, aunque ya confirmamos que enviamos los datos acordados -dijo el navegador web.
-uhmmm… esto es inesperado, siendo que además el método que utilizan es muy sencillo. ¿Les parece se hacemos una prueba en línea? – Sugirió la API.
Y así hicieron. El HTML y el navegador web prepararon todo el ambiente, se generó otro nuevo JSON y lo enviaron. Iniciada la comunicación y la recepción del mensaje, la API revisó su buzón:

NADA. $_POST estaba vacío.
-¡No puede ser! – Exclamó el HTML.
-Yo tampoco entiendo -secundó la API.
Ambos miraron al narrador…

-Yo solo soy el que escribe la crónica -dijo- y mi confusión es la suya.
Decidieron hacer una prueba más; incluso cambiaron el método de POST a GET.
NADA. $_POST y $_GET estaban vacíos.
Entonces, ¿las leyendas del JSON fantasma errante eran ciertas?
-Es que no lo entiendo -dijo la API- he estado intercambiando datos ida y vuelta con otros clientes, pero contigo parece que el JSON desparace, porque tu mensaje sí que llega.
El navegador sugirió consultar las antiguas escrituras, los mensajes de los PHPs del pasado y ahí, justo en la historia detrás, estaba la respuesta (que además dirigió al narrador a otro foro):
¿Qué pasó con el JSON Fantasma entonces? ¿Estabamos ante un caso de JSONGEIST? ¿Por eso el día obscuro y frío?
Resulta que $_POST y $_GET no se poblan automáticamente cuando se envía una cadena JSON (¿recuerdas el método stringify()?) por POST o GET y el Content-Type es precisamente, json.
Por razones históricas, PHP lo hace así.
Antes de POST o GET, existe este flujo de datos:
php://input
Y el JSON se queda ahí.
Para recuperarlo, hay que obtener los datos del flujo, decodificar el json y poblar las variables globales $_POST o $_GET (según la necesites de acuerdo a tu método de entrada) y consultar los datos mediante su índice, como ya te debe ser habitual, es decir:
$_POST = json_decode(file_get_contents('php://input'), true);
$dato1 = $_POST["dato1"]; // ahora si debe haber datos
$dato2 = $_POST["dato2"];
Habiendo hecho este ajuste en la API, el JSON fantasma apareció, la API pudo validar los datos y entregar una respuesta acorde.
El HTML y el navegador web se despidieron de la API y se retiraron, para cerrar el día después de haber cumplido su misión.

Deja un comentario