Cacheando peticiones con OkHttp (parte 1)
En muchas ocasiones va a ser necesario que nuestras aplicaciones accedan a servicios web. Ya sea para prevenir excesos en el consumo de datos, la lentitud o la sobrecarga en el servidor, vamos a tener que atender a la cache de las peticiones que realicemos.
Lo ideal en estos casos es que esto sea controlado por las cabeceras que envía el servidor web:
$ curl -I https://api.github.com/users/tyrbokHTTP/1.1 200 OK
Server: GitHub.com
Content-Type: application/json; charset=utf-8
Content-Length: 1206
Status: 200 OK
Cache-Control: public, max-age=60, s-maxage=60
Vary: Accept
...
Controlando respuestas con Cache-Control
Para estos casos OkHttp nos facilita el trabajo con una opción para habilitar una cache en disco:
En el ejemplo anterior vemos que podemos que podemos indicar, al cliente de OkHttp, donde vamos a almacenar los datos cacheados y cuál va a ser el tamaño máximo de dicha cache.
Controlando respuestas sin Cache-Control
No siempre nos vamos a encontrar con esta cabecera o simplemente queremos cachear la petición un tiempo diferente o bajo otra serie de condiciones a las que no da el servidor.
Para estos casos podemos crear "Interceptores" que nos ayuden a modificar el comportamiento de las peticiones.
En el siguiente ejemplo crearemos un interceptor que añade una cabecera Cache-Control de 120 segundos:
Gracias a los métodos .addInterceptor() y .addNetworkInterceptor(), podemos añadir todos los interceptores que necesitemos para manipular las peticiones o simplemente para nuestros logs.
Al tener disponibles tanto el Request como el Response, podemos modificar las cabeceras de cache que necesitemos en cada caso, por ejemplo para peticiones dentro del path /api/ que devuelvan la cabecera Content-Type:application/json.
Conclusión
OkHttp nos facilita los mecanismos para cachear nuestras peticiones en disco sin necesidad de introducir nuevas capas en nuestra aplicación. Cómo utilizarlos y combinarlos dependen de las necesidades y dependencias que tengamos, sin que la librería nos limite a casos de uso específicos.