7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Android SDK

Empieza con Retrofit 2 HTTP Client

Scroll to top
Read Time: 15 mins

Spanish (Español) translation by Kelly Gianella (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

¿Qué es Retrofit?

Retrofit es la seguridad de tipos de HTTP client  para Android y Java. El Retrofit facilita la conexión al servicio web REST mediante la traducción de API a interfaces Java. En este tutorial, te mostraré cómo utilizar una de las bibliotecas disponibles HTTP más populares y recomendadas para Android.

Esta poderosa biblioteca facilita el consumo de datos JSON o XML que luego se analizan en objetos Java antiguos sin formato (POJOs). Se pueden ejecutar solicitudes GET, POST, PUT, PATCH y DELETE.  

Al igual que la mayoría del software de código abierto, Retrofit se construyó sobre otras bibliotecas y herramientas poderosas. En segundo plano, Retrofit hace uso de OkHttp (del mismo desarrollador) para manejar las solicitudes de red. Además, Retrofit no tiene incorporado ningún convertidor JSON para analizar de JSON a objetos Java. En su lugar, incluye soporte para las siguientes bibliotecas convertidoras de JSON para manejar eso:

  • Gson: com.squareup.retrofit:converter-gson
  • Jackson: com.squareup.retrofit:converter-jackson
  • Moshi: com.squareup.retrofit:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Cable: com.squareup.retrofit2:converter-wire

Y para XML, Retrofit admite:

  • Marco simple: com.squareup.retrofit2:converter-simpleframework

Entonces, ¿Por qué usar Retrofit?

Si bien es cierto, el desarrollar tu propia biblioteca HTTP de seguridad de tipos para interactuar con una API REST puede ser un verdadero dolor: tienes que manejar muchas funcionalidades tales como hacer conexiones, almacenamiento en caché, reintento de solicitudes fallidas, hilos, análisis de respuestas, manejo de errores, y más. Retrofit, por otro lado, está muy bien planificado, documentado y probado, una biblioteca probada en batalla que le ahorrará mucho tiempo precioso y dolores de cabeza.

En este tutorial, explicaré cómo usar Retrofit 2 para controlar las solicitudes de red mediante la creación de una aplicación sencilla para consultar las respuestas recientes de la API de Intercambio de pilas. Realizaremos peticiones GETespecificando un punto final-/respuestas, anexado a la URL base https://api.stackexchange.com/2.2/- para obtener los resultados y mostrarlos en una vista del reciclador. También te mostraré cómo hacer esto con RxJava para una fácil gestión del flujo de estado y datos.

1. Crea un proyecto de Android Studio

Enciénde Android Studio y crea un nuevo proyecto con una actividad vacía denominada MainActivity.

Create a new empty activityCreate a new empty activityCreate a new empty activity

2. Declara dependencias

Después de haber creado un nuevo proyecto, declara las siguientes dependencias en tu build.gradle. Las dependencias incluyen una vista de reciclaje, la biblioteca Retrofit, y también la biblioteca Gson de Google para convertir JSON en POJO (Plain Old Java Objects), así como la integración Gson de Retrofit.

No olvides sincronizar el proyecto para descargar estas bibliotecas.

3. Agrega el permiso de Internet

Para realizar operaciones de red, necesitamos incluir el permiso de INTERNET en el manifiesto de aplicación: AndroidManifest.xml.

4. Genera automaticamente modelos

Vamos a crear nuestros modelos automáticamente de nuestros datos de respuesta JSON aprovechando esta herramienta muy útil: jsonschema2pojo.

Obten los datos JSON de muestra

Copia y pega https://api.stackexchange.com/2.2/answers?order=desc&sort=activity&site=stackoverflow en la barra de direcciones de tu navegador (o puedes usar Postman si es que sabes cómo usar esta herramienta). A continuación, pulsa Enter: esto ejecutará una solicitud GET en el punto final indicado. Lo que verás como respuesta es un array de objetos JSON. La captura de pantalla de abajo es la respuesta JSON usando Postman.

API response to GET requestAPI response to GET requestAPI response to GET request

Copia esta respuesta JSON desde tu navegador o Postman.

Asigna los datos JSON a Java

Ahora visita jsonschema2pojo y pega la respuesta JSON en el cuadro de entrada.

Selecciona un tipo de fuente de JSON, un estilo de anotación de Gson y desmarca Permitir propiedades adicionales.

jsonschema2pojo interfacejsonschema2pojo interfacejsonschema2pojo interface

A continuación, haz clic en el botón Preview  para generar los objetos de Java.

jsonschema2pojo outputjsonschema2pojo outputjsonschema2pojo output

Es posible que te preguntes qué hacen las anotaciones @SerializedName y @Expose en este código generado. ¡No te preocupes, te lo explicaré todo!

La anotación @SerializedName es necesaria para que Gson asigne las claves JSON con nuestros campos. De acuerdo con la convención de nomenclatura camelCase de Java para las propiedades de miembro de clase, no se recomienda utilizar guiones bajos para separar palabras en una variable. @SerializedName nos ayuda a traducir entre los dos.

En el ejemplo anterior, le estamos diciendo a Gson que nuestra clave JSON quota_remaining debe ser mapeada al campo Java quotaRemaining. Si ambos valores fueran iguales, es decir, si nuestra clave JSON fuera quotaRemaining al igual que el campo Java, entonces no habría necesidad de la anotación @SerializedName en el campo porque Gson los asignaría automáticamente.

La anotación @Expose indica que este miembro debe exponerse para la serialización o deserialización JSON.

Importar modelos de datos a Android Studio

Ahora volvamos a Android Studio. Crea un nuevo sub-paquete dentro del paquete principal y asígnalo el nombre datos. Dentro del paquete de datos recién creado, cree otro paquete y asígnelo el nombre modelo. Dentro del paquete del modelo, crea una nueva clase Java y ponle el nombre Propietario. Ahora copia la clase Propietario  generada por jsonschema2pojo y pégala dentro de la clase Propietario que creaste.

Haz lo mismo para una nueva clase Elemento, copiada de jsonschema2pojo.

Por último, crea una clase denominada SOAnswersResponse para las respuestas StackOverflow devueltas. Encontrarás el código para esta clase en jsonschema2pojo como por Ejemplo. Asegúrate de actualizar el nombre de la clase a SOAnswersResponse siempre que aparezca.

5. Crea la instancia de Retrofit

Para emitir peticiones de red a una API REST con Retrofit, necesitamos crear una instancia utilizando la clase Retrofit.Builder y configurarla con una URL base.

Crea un nuevo paquete de sub-paquete dentro del paquete de datos y ponle el nombre remoto. Ahora dentro del control remoto, crea una clase Java y asígnala con el nombre RetrofitClient. Esta clase creará un singleton de Retrofit. Retrofit necesita una URL base para construir su instancia, por lo que pasaremos una URL al llamar a RetrofitClient.getClient(String baseUrl). Esta dirección URL se utilizará para generar la instancia en la línea 13. También estamos especificando el convertidor de JSON que necesitamos (Gson) en la línea 14.

6. Crear la interfaz API

Dentro del paquete remoto, crea una interfaz y llámala SOService. Esta interfaz contiene métodos que vamos a usar para ejecutar solicitudes HTTP como GET, POST, PUT, PATCH y DELETE. Para este tutorial, vamos a ejecutar una solicitud GET.

La anotación @GET define explícitamente esa solicitud GET que se ejecutará una vez que se llame al método. Cada método de esta interfaz debe tener una anotación HTTP que proporcione el método de solicitud y la dirección URL relativa. Hay cinco anotaciones integradas disponibles: @GET, @POST, @PUT, @DELETE y @HEAD.

En la segunda definición del método, añadimos un parámetro de consulta para que podamos filtrar los datos del servidor. Retrofit tiene la anotación @Query("key") para usarla en lugar de codificarla de forma rígida en el extremo. El valor de clave representa el nombre del parámetro en la dirección URL. Será añadido a la URL por Retrofit. Por ejemplo, si pasamos el valor "android" como argumento al método getAnswers(String tags), la URL completa será:

Los parámetros de los métodos de interfaz pueden tener las siguientes anotaciones:

@Path sustitución de variables para el punto de conexión de API
@Query especifica el nombre de la clave de consulta con el valor del parámetro anotado
@Body carga útil de la llamada POST
@Header especifica el encabezado con el valor del parámetro anotado

7. Crea las utlidades de API

Ahora vas a crear una clase de utilidad. Lo llamaremos ApiUtils. Esta clase tendrá la URL base como una variable estática y también proporcionará la interfaz SOService a nuestra aplicación a través del método estático getSOService().

8. Muestra un RecyclerView

Dado que los resultados se mostrarán en una vista de reciclador, necesitamos un adaptador. El fragmento de código siguiente muestra la clase AnswersAdapter.

9. Ejecuta la solicitud

Dentro del método onCreate() de MainActivity, inicializamos una instancia de la interfaz SOService (línea 9), la vista del reciclador y también el adaptador. Por último, llamamos al método loadAnswers().

El método loadAnswers() realiza una solicitud de red llamando a enqueue(). Cuando la respuesta vuelve, Retrofit nos ayuda a analizar la respuesta JSON a una lista de objetos Java. (Esto es posible mediante el uso de GsonConverter.)

10. Entienda enqueue()

enqueue() envía de forma asíncrona la solicitud y notifica a tu aplicación con una devolución de llamada cuando recibe una respuesta. Dado que esta solicitud es asincrónica, Retrofit la controla en un subproceso en segundo plano para que el subproceso principal de la interfaz de usuario no se bloquee ni interfiera con él.

Para utilizar enqueue(), hay que implementar dos métodos de callback:

  • onResponse()
  • onFailure()

Solo se llamará a uno de estos métodos en respuesta a una solicitud determinada.

  • onResponse(): se invoca para una respuesta HTTP recibida. Se llama a este método para obtener una respuesta que se puede controlar correctamente incluso si el servidor devuelve un mensaje de error. Por lo tanto, si obtienes un código de estado de 404 o 500, se seguirá llamando a este método. Para obtener el código de estado para que puedas manejar situaciones basadas en ellas, puedes usar el método response.code(). También puedes utilizar el método isSuccessful() para averiguar si el código de estado está en el intervalo 200-300, esto indica que se ha realizado correctamente.
  • onFailure(): se invoca cuando se produce una excepción de red en la comunicación con el servidor o cuando se produce una excepción inesperada en la gestión de la solicitud o en el procesamiento de la respuesta.

Para realizar una solicitud sincrónica, puedes utilizar el método execute(). Ten en cuenta que los métodos sincrónicos en el subproceso principal/UI bloquearán cualquier acción del usuario. ¡Así que no ejecutes métodos sincrónicos en el hilo principal / UI de Android! En su lugar, ejecútalos en un subproceso en segundo plano.

11. Prueba la aplicación

Ahora puedes ejecutar la aplicación.

Sample results from StackOverflowSample results from StackOverflowSample results from StackOverflow

12. Integra RxJava

Si eres un fan de RxJava, puedes implementar fácilmente Retrofit con RxJava. En Retrofit 1 estaba integrado por defecto, pero en Retrofit 2 hay que incluir algunas dependencias extra. Retrofit se suministra con un adaptador predeterminado para ejecutar instancias de call. Por lo tanto, puedes cambiar el mecanismo de ejecución de Retrofit para incluir RxJava mediante la inclusión de RxJava CallAdapter.

Paso 1

Agrega las dependencias.

Paso 2

Añade el nuevo CallAdapter RxJavaCallAdapterFactory.create() al construir una instancia de Retrofit.

Paso 3

Al realizar las peticiones, nuestro suscriptor anónimo responde al stream que emite eventos, en nuestro caso SOAnswersResponse. A continuación, se llama al método onNext cuando nuestro suscriptor recibe cualquier evento emitido que luego se pasa a nuestro adaptador.

Echa un vistazo a Introducción a ReactiveX en Android por Ashraff Hathibelagal para obtener más información sobre RxJava y RxAndroid.

Conclusión

En este tutorial, has aprendido sobre Retrofit: por qué deberías usarlo y cómo. También expliqué cómo agregar la integración de RxJava con Retrofit. En mi próxima publicación, te mostraré cómo realizar POST, PUT y DELETE, cómo enviar datos codificados con Form-Urlencoded y cómo cancelar solicitudes.

Para obtener más información sobre Retrofit, consulta la documentación oficial. Y mientras tanto, echa un vistazo a algunos de nuestros otros cursos y tutoriales sobre el desarrollo de aplicaciones para Android.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.