Pasé un día intentando averiguar qué estaba mal con la respuesta ilegible que mostraba el navegador desde mi servidor de API Flask. Curiosamente, tengo otros endpoints que funcionan perfectamente, pero no esta nueva ruta que acababa de añadir. Esto es lo que aprendí para solucionar el problema.
Averiguar cuál es la causa
Descubrí que hay tres razones principales que provocan esto.
- Content-Type: el charset no está configurado como UTF-8, o ni siquiera se percibe como JSON
- Content-Encoding: la compresión automática predeterminada del navegador para JSON entra en conflicto con el método de codificación de la API.
Dos formas de comprobarlo
cURL
Abre tu Terminal y usa cURL
curl -v "https://yourdomain.com/endpoint?"Si el JSON se muestra correctamente, significa que lo más probable es que sea el navegador el que está causando el problema.
Si se muestra ilegible, asegúrate de tener el charset configurado como UTF-8 en la aplicación Flask. Porque eso significa que el problema no está en la transmisión, sino que fundamentalmente no se estaba gestionando bien dentro de Flask, y podría ser un problema de tipo de objeto o de codificación.
Herramientas de desarrollo del navegador
- Ve a la pestaña Network y actualiza la página de tu endpoint
- Comprueba que el Content-Type sea ‘application/json; charset=UTF-8’
Soluciones
Content-Type
Si falta application/json o charset=UTF-8, añade el siguiente response.header a tu aplicación de API Flask para tu endpoint:
response.headers['Content-Type'] = 'application/json; charset=UTF-8'Ahora, reinicia la aplicación y vuelve a intentarlo para ver si funciona. Si no es así, pasa al siguiente paso.
Content-Encoding
Ahora que ya te has asegurado de que el Content-Type no es el problema, ya que se muestra correctamente como application/json; charset=UTF-8, sigamos con la segunda causa: el error de codificación.
De forma predeterminada, cuando una API Flask envía una respuesta al navegador, comprime el contenido automáticamente. Y luego el navegador intenta decodificarlo. Sin embargo, por alguna razón no puede decodificarlo correctamente.
El ejemplo perfecto sería que cURL -v obtiene la respuesta correcta pero en el navegador se ve ilegible. (Este es mi caso.) cURL por defecto no recibe una respuesta comprimida/codificada, por eso funciona en cURL pero no en el navegador.
Para solucionarlo, tendrás que añadir lo siguiente en la respuesta de tu aplicación de API Flask:
response.headers['Content-Encoding'] = 'identity'Esto desactivará la compresión de forma predeterminada, para que tu navegador pueda recibir lo mismo que recibe cURL.
Eso debería solucionarlo.
Buena suerte.