Lo habitual hoy en día es que cualquier aplicación móvil dependa de una API Rest y que sea una rutina tener que ejecutar test o tener que depurar problemas en los que la conexión al API es uno de los factores clave.
En el caso de los tests hay herramientas muy útiles como la librería OHHTTPStubs pero en otros casos necesitamos ver la comunicación y a veces devolver o modificar cabeceras para forzar alguna prueba. En este artículo voy a explicar como modificar la respuesta de una llamada a un API para forzar que se devuelva un error 500 usando Charles, una navaja suiza para interceptar tráfico web.
Alternativas a Charles
Charles es sin duda una de mis herramientas favoritas en el día a día. Es un proxy que sirve para capturar el tráfico entre un navegador Web o un dispositivo móvil e Internet, y su único problema es que hay que pagar por la versión completa. Existen algunas alternativas interesantes y gratuitas como Wireshark bastante más complejo y farragoso de usar o mitmproxy que permite hacer cosas semejantes a Charles en una fría consola, aunque de forma infinitamente más nerd.
Ambas son herramientas gratuitas pero demasiado complejas para mi gusto y objetivos (tener tiempo para vivir) y no están tan bien pensadas como Charles que por otro lado se puede usar para evaluarlo con algunas restricciones (esperas al acceder a ciertas pantallas y un limite por sesión de 30 minutos)
El problema
Supongamos que tenemos una incidencia en la que una respuesta 500 a una llamada al API causa cierto problema en nuestra aplicación. Por tanto, necesitamos que el servidor nos devuelva un error 500 (Internal Server Error) para poder depurar que hace nuestra aplicación. Lamentablemente el servidor solo devuelve felices códigos 200 en este momento y no podemos reproducir el contexto del error.
Usando Charles para cambiar la respuesta del servidor
Lo primero que tenemos que hacer es pasar el trafico del dispositivo a través del proxy. Para ello solo tenemos que configurar el dispositivo para que el Proxy sea la máquina en la que tenemos instalado Charles. En el menú de ayuda la propia aplicación nos indicarña dirección IP, puerto e incluso url para descargar los certificados en caso de necesitar hacer proxy SSL.
Una vez tenemos el tráfico redirigido, tenemos que elegir la llamada que queremos "suplantar" y configurar la herramienta de re-escritura de Charles. Para ello accederemos en el menú Tools -> Rewrite
Y nos abrirá un diálogo en el que podemos añadir unas reglas.
Aqui podemos añadir una que se llame por ejemplo "Return Error 500"
Añadiremos entonces la URL en la que vamos a reescribir la respuesta en el apartado Location, poniendo Host, Path y puerto. Por último añadiremos dos reglas:
- Una para modificar el Response Status de 200 a 500, eligiendo el tipo Response Status en el desplegable.
- Una para cambiar la respuesta del json o xml que se devuelva a un mensaje de error, eligiendo el tipo Body en el desplegable.
El resultado
La aplicación, que seguro habita placidamente nuestro ipad, iphone o simulador de xCode, recibirá un Response Status 500 y podremos depurar o evaluar nuestro problema sin alterar nada del código.
Podremos ver que se destaca la petición con el icono de una bomba y en el panel de detalle se puede ver la información sobre el cambiazo.
Esta sencilla receta da una idea del tiempo que ahorra esta herramienta al desarrollador para analizar las respuestas del servidor en crudo y para manipular detalles de la comunicación. Más que eso, te da la tranquilidad de saber que está ocurriendo a nivel de red y convierte la aplicación en una caja negra para ciertos problemas. Charles es una aplicación tremendamente útil que esconde un montón de trucos que muchas veces salvan el día.