Envío de datos con el cliente HTTP Retrofit 2 para Android

Lo que vas a crear

¿Qué es la adaptación?

Retrofit es un cliente HTTP seguro para el tipo para Android y Java. La actualización facilita la conexión a un servicio web REST mediante la traducción de la API a interfaces Java. En este tutorial, te mostraré cómo usar una de las bibliotecas HTTP más populares y recomendadas disponibles para Android.

Esta potente biblioteca facilita el consumo de datos JSON o XML, que luego se analizan en objetos Java antiguos sin formato (POJO). OBTENERENVIARPONERPARCHE, y BORRAR todas las solicitudes pueden ser ejecutadas. 

Como la mayoría de los programas de código abierto, Retrofit se construyó sobre algunas otras bibliotecas y herramientas potentes. Detrás de escena, Retrofit utiliza OkHttp (del mismo desarrollador) para manejar las solicitudes de red. Además, Retrofit no tiene un convertidor JSON incorporado para analizar desde JSON a objetos Java. En su lugar, incluye soporte para las siguientes bibliotecas de convertidores JSON para manejar eso:

  • Gson: com.squareup.retrofit: converter-gson
  • Jackson: com.squareup.retrofit: convertidor-jackson
  • Moshi: com.squareup.retrofit: convertidor-moshi

Para los buffers de protocolo, Retrofit soporta:

  • Protobuf: com.squareup.retrofit2: converter-protobuf
  • Cable: com.squareup.retrofit2: cable convertidor

Y para XML Retrofit, soporta:

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

Entonces, ¿por qué usar Retrofit?

El desarrollo de su propia biblioteca HTTP de tipo seguro para interactuar con una API REST puede ser una verdadera molestia: tiene que manejar muchos aspectos, como hacer conexiones, almacenar en caché, reintentar solicitudes fallidas, crear hilos, analizar respuestas, manejar errores y mucho más. Retrofit, por otro lado, es una biblioteca bien planificada, documentada y probada que le ahorrará un tiempo precioso y dolores de cabeza.

En este tutorial, explicaré cómo usar Retrofit 2 para manejar las solicitudes de red mediante la creación de una aplicación sencilla que realice ENVIAR peticiones, PONER solicitudes (para actualizar entidades), y BORRAR peticiones. También te mostraré cómo integrarte con RxJava y cómo cancelar solicitudes. Utilizaremos la API proporcionada por JSONPlaceholder: esta es una API REST en línea falsa para pruebas y creación de prototipos..

Echa un vistazo a mi publicación anterior, Comenzar con Retrofit 2 HTTP Client, para aprender cómo ejecutar OBTENER Solicitudes y como integrar Retrofit con RxJava.. 

1. Crear un proyecto de Android Studio

Inicie Android Studio y cree un nuevo proyecto con una actividad vacía llamada Actividad principal.

2. Declarar Dependencias

Después de crear un nuevo proyecto, declare las siguientes dependencias en su construir.gradle. Las dependencias incluyen la biblioteca Retrofit y también la biblioteca Gson de Google para convertir JSON a POJO (objetos Java antiguos), así como la integración Gson de Retrofit. 

// Retrofit compile 'com.squareup.retrofit2: retrofit: 2.1.0' // JSON Parsing compile 'com.google.code.gson: gson: 2.6.1' compile 'com.squareup.retrofit2: converter-gson: 2.1 .0 '

Asegúrate de sincronizar tu proyecto después de agregar las dependencias. 

3. Agregar permiso de Internet

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

           

4. Generando Modelos Automáticamente

Vamos a crear modelos automáticamente a partir de los datos de respuesta de JSON aprovechando una herramienta muy útil: jsonschema2pojo. Nos gustaría hacer un ENVIAR solicitud (crear un nuevo recurso) en la API. Pero antes de ejecutar esta solicitud, necesitamos conocer la respuesta JSON que deberíamos esperar cuando se ejecute correctamente para que Retrofit pueda analizar la respuesta JSON y deserializarla en objetos Java. De acuerdo con la API, si enviamos los siguientes datos en un ENVIAR solicitud:

datos: título: 'foo', cuerpo: 'barra', ID de usuario: 1

Deberíamos obtener la siguiente respuesta:

"title": "foo", "body": "bar", "userId": 1, "id": 101

Asignar los datos JSON a Java 

Copie los datos de respuesta de muestra de la sección anterior. Ahora visite jsonschema2pojo y pegue la respuesta JSON en el cuadro de entrada. Seleccione el tipo de fuente de JSON, estilo de anotación de Gson, desmarcar Permitir propiedades adicionales, y cambiar el nombre de la clase de Ejemplo a Enviar

Luego haga clic en el Avance Botón para generar los objetos Java.. 

Usted podría estar preguntándose qué @SerializedName y @Exponer ¡Las anotaciones hacen en este código generado! No te preocupes, te lo explicaré todo.!

los @SerializedName Se necesita una anotación para que Gson asigne las claves JSON a los campos de objeto Java.

@SerializedName ("userId") @Expose private Integer userId;

En este caso, la clave JSON. ID de usuario se asigna al campo de clase ID de usuario. Pero tenga en cuenta que, dado que son iguales, no es necesario incluir @SerializedName anotación en el campo porque Gson la mapeará automáticamente para nosotros.

los @Exponer la anotación indica que el miembro de la clase debe estar expuesto para la serialización o deserialización JSON. 

Importar modelos de datos a Android Studio

Ahora volvamos a Android Studio. Crea un nuevo subpaquete dentro del principal empacar y nombrarlo datos. Dentro del paquete recién creado, crea otro paquete y nómbrelo modelo. Dentro de este paquete, crea una nueva clase de Java y nómbrela Enviar. Ahora copia el Enviar clase generada por jsonschema2pojo y pegarla dentro de la Enviar clase que creaste. 

paquete com.chikeandroid.retrofittutorial2.data.model; importar com.google.gson.annotations.Expose; importar com.google.gson.annotations.SerializedName; Public class Post @SerializedName ("title") @Expose private String title; @SerializedName ("body") @Expose private String body; @SerializedName ("userId") @Expose private Integer userId; @SerializedName ("id") @Expose private Integer id; public String getTitle () return title;  public void setTitle (String title) this.title = title;  public String getBody () return body;  public void setBody (String body) this.body = body;  public Entero getUserId () return userId;  public void setUserId (integer userId) this.userId = userId;  public Entero getId () return id;  public void setId (ID de entero) this.id = id;  @Override public String toString () return "Post " + "title = '" + title +' \ "+", + body + "\" + ", userId =" + userId + ", / posts") @FormUrlEncoded Call savePost (@Field ("title") String title, @Field ("body") String body, @Field ("userId") long userId); 

Mirando a la APIServicio clase, tenemos un metodo llamado savePost (). Encima del método está el @ENVIAR anotación, lo que indica que queremos ejecutar un ENVIAR Solicitar cuando se llama este método. El valor del argumento para el @ENVIAR La anotación es el punto final, que es / mensajes. Así que la URL completa será http://jsonplaceholder.typicode.com/posts. 

Bien, ¿y qué pasa con el @FormUrlEncoded? Esto indicará que la solicitud tendrá su tipo MIME (un campo de encabezado que identifica el formato del cuerpo de una solicitud o respuesta HTTP) establecido en aplicación / x-www-form-urlencoded y también que sus nombres de campo y valores serán codificados en UTF-8 antes de ser codificados en URI. los @ Campo ("clave") la anotación con el nombre del parámetro debe coincidir con el nombre que la API espera. Retrofit convierte implícitamente los valores a cadenas usando String.valueOf (objeto), y las cadenas son entonces forma URL codificada. nulo los valores son ignorados. 

Por ejemplo, llamando APIService.savePost ("Mi visita a Lagos", "Visité ...", 2) cede un cuerpo de solicitud de title = My + Visit + To + Lagos & body = I + visit ... y userId = 2.

Utilizando la @Cuerpo Anotación

También podemos utilizar el @Cuerpo anotación en un parámetro de método de servicio en lugar de especificar un cuerpo de solicitud de estilo de formulario con varios campos individuales. El objeto será serializado usando el Reequipamiento ejemplo Convertidor especificado durante la creación. Esto solo se usa cuando se realiza una ENVIAR o PONER operación. 

@POST ("/ posts") @FormUrlEncoded Call savePost (@Body Post post);

7. Creando las Utilidades API

Vamos a crear una clase de utilidad. Así que crea una clase en data.remote y nombrarlo ApiUtils. Esta clase tendrá la URL base como una variable estática y también proporcionará la APIServicio interfaz por una getAPIService () Método estático para el resto de nuestra aplicación..

paquete com.chikeandroid.retrofittutorial2.data.remote; clase pública ApiUtils private ApiUtils ()  public String final String BASE_URL = "http://jsonplaceholder.typicode.com/"; public APIService estático getAPIService () return RetrofitClient.getClient (BASE_URL) .create (APIService.class); 

Asegúrate de terminar la URL base con una /

8. Creando el diseño

El archivo activity_main.xml es el diseño para nuestro Actividad principal. Este diseño tendrá un campo de edición de texto para el título de la publicación y otro para el cuerpo de la publicación. También incluye un botón para enviar la publicación a la API.. 

     

9. Ejecutando la solicitud POST

En el onCreate () método en Actividad principal, Inicializamos una instancia de la APIServicio interfaz (línea 14). También inicializamos Editar texto campos y un botón de enviar que llamará el enviarPost () Método al hacer clic (línea 22).

privado TextView mResponseTv; APIService privado mAPIService; @Override protected void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); final EditText titleEt = (EditText) findViewById (R.id.et_title); final EditText bodyEt = (EditText) findViewById (R.id.et_body); Button submitBtn = (Button) findViewById (R.id.btn_submit); mResponseTv = (TextView) findViewById (R.id.tv_response); mAPIService = ApiUtils.getAPIService (); submitBtn.setOnClickListener (new View.OnClickListener () @Override public void onClick (vista de vista) String title = titleEt.getText () .String (). trim (); String body = bodyEt.getText (). toString () .trim (); if (! TextUtils.isEmpty (title) &&! TextUtils.isEmpty (body)) sendPost (title, body);); 

En el sendPost (String, String) método en el Actividad principal Clase, pasamos en el título y el cuerpo de la publicación a este método. Lo que este método hará es llamar a nuestro método de interfaz de servicio API savePost (String, String) cuyo trabajo es ejecutar un ENVIAR Solicitud de envío del título y cuerpo a la API. los showResponse (respuesta de cadena) Método mostrará la respuesta en la pantalla..

public void sendPost (título de la cadena, cuerpo de la cadena) mAPIService.savePost (título, cuerpo, 1) .enqueue (nueva devolución de llamada() @Override public void onResponse (Llamar llamada, respuesta respuesta) if (response.isSuccessful ()) showResponse (response.body (). toString ()); Log.i (TAG, "publicación enviada a API." + Response.body (). ToString ());  @ Anular la anulación pública en caso de fallo (llamada call, Throwable t) Log.e (TAG, "No se puede enviar la publicación a la API."); );  public void showResponse (String response) if (mResponseTv.getVisibility () == View.GONE) mResponseTv.setVisibility (View.VISIBLE);  mResponseTv.setText (respuesta); 

Nuestro APIServicio ejemplo mAPIServicio método savePost (String, String) devolverá un Llamada instancia que tiene un método llamado encolar (devolución de llamada llamar de vuelta).

Comprensión poner en cola ()

poner en cola () envía de forma asíncrona la solicitud y notifica a su aplicación con una devolución de llamada cuando se recibe una respuesta. Dado que esta solicitud es asíncrona, Retrofit maneja la ejecución en un subproceso en segundo plano para que el subproceso de la interfaz de usuario principal no se bloquee o interfiera. 

Usar el poner en cola () Método, tienes que implementar dos métodos de devolución de llamada: onResponse ()onFailure (). Solo se llamará uno de estos métodos en respuesta a una solicitud dada. 

  • onResponse (): invocado para una respuesta HTTP recibida. Se llama a este método para obtener una respuesta que se pueda manejar correctamente incluso si el servidor devuelve un mensaje de error. Por lo tanto, si obtiene un código de estado de 404 o 500, este método aún será llamado. Para obtener el código de estado para que pueda manejar situaciones basadas en ellas, puede utilizar el método código de respuesta(). También puedes usar el es exitoso() Método para averiguar si el código de estado está en el rango 200-300, lo que indica el éxito.
  • onFailure (): se invoca cuando se produce una excepción de red al comunicarse con el servidor o cuando se produce una excepción inesperada al manejar la solicitud o al procesar la respuesta.

Solicitudes sincrónicas

Para realizar una solicitud síncrona, puede utilizar el ejecutar() método en un Llamada ejemplo. Pero tenga en cuenta que los métodos síncronos en el hilo principal / UI bloquearán cualquier acción del usuario. ¡Así que no ejecute métodos síncronos en el hilo principal / UI de Android! En lugar de ejecutarlos en un hilo de fondo.

Utilizando RxJava 

RxJava se integró en Retrofit 1 de forma predeterminada, pero en Retrofit 2 debe incluir algunas dependencias adicionales. El reequipamiento se entrega con un adaptador predeterminado para la ejecución Llamada instancias. Así que puedes cambiar el mecanismo de ejecución de Retrofit para incluir RxJava incluyendo el RxJava CallAdapter. Estos son los pasos:

Paso 1

Añade las dependencias.

compile 'io.reactivex: rxjava: 1.1.6' compile 'io.reactivex: rxandroid: 1.2.1' compile 'com.squareup.retrofit2: adapter-rxjava: 2.1.0'

Paso 2

Agrega el nuevo CallAdapter RxJavaCallAdapterFactory.create () al construir una instancia de Retrofit (línea 5).  

public static Retrofit getClient (String baseUrl) if (retrofit == null) retrofit = new Retrofit.Builder () .baseUrl (baseUrl) .addCallAdapterFactory (Rpc). (); retorno de retorno; 

Paso 3

Actualizar el APIServicio savePost (título de cadena, cuerpo de cadena, ID de usuario de cadena) Método para convertirse en un observable. 

@POST ("/ posts") @FormUrlEncoded Observable savePost (@Field ("title") String title, @Field ("body") String body, @Field ("userId") long userId);

Etapa 4

Al realizar las solicitudes, nuestro suscriptor anónimo responde al flujo del observable que emite eventos, en nuestro caso Enviar. los En el siguiente El método se llama cuando nuestro suscriptor recibe cualquier evento, que luego se pasa a nuestro showResponse (respuesta de cadena) método. 

public void sendPost (String title, String body) // RxJava mAPIService.savePost (title, body, 1) .subscribeOn (Schedulers.io ()). observeOn (AndroidSchedulers.mainThread ()) .subscribe (nuevo Suscriptor() @Override public void onCompleted ()  @Override public void onError (Throwable e)  @Override public void onNext (Publicar publicación) showResponse (post.toString ()); ); 

Echa un vistazo a Comenzando con ReactiveX en Android por Ashraff Hathibelagal para aprender más sobre RxJava y RxAndroid. 

10. Probando la aplicación

En este punto, puede ejecutar la aplicación y hacer clic en el botón Enviar cuando haya ingresado un título y un cuerpo. La respuesta de la API se mostrará debajo del botón enviar.. 

11. Ejecutando una solicitud PUT

Ahora que sabemos cómo ejecutar un ENVIAR solicitud, vamos a ver cómo podemos ejecutar una PONER Solicitar que las entidades actualicen. Agregue el siguiente método nuevo al APIServicio clase. 

@PUT ("/ posts / id") @FormUrlEncoded Call updatePost (@Path ("id") long id, @Field ("title") Título de la cadena, @Field ("body") Cuerpo de la cadena, @Field ("userId") long userId);

Para actualizar una publicación desde la API, tenemos el punto final / posts / id con carné de identidad ser un marcador de posición para el id de la publicación que queremos actualizar. los @Camino La anotación es el reemplazo nombrado en un segmento de ruta de URL. carné de identidad. Tenga en cuenta que los valores se convierten en cadena utilizando String.valueOf (objeto) y URL codificada. Si el valor ya está codificado, puede desactivar la codificación de URL de esta manera: @Path (valor = "nombre", codificado = verdadero)

12. Ejecutando una solicitud DELETE

Veamos también cómo ejecutar un BORRAR solicitud. Usando la API JSONPlaceholder, para eliminar un recurso de publicación, el punto final requerido es / posts / id con el método HTTP BORRAR. De vuelta a nuestro APIServicio interfaz, solo necesitamos incluir el método Eliminar mensaje() Eso lo ejecutará. Pasamos el ID de la publicación al método, y se reemplaza en el segmento de la ruta URL. carné de identidad.

@DELETE ("/ posts / id") Llamada deletePost (@Path ("id") id largo);

13. Cancelar una solicitud

Digamos que quiere darles a sus usuarios la posibilidad de cancelar o abortar una solicitud. Esto es muy fácil de hacer en Retrofit. El reequipamiento Llamada La clase tiene un método llamado cancelar() eso hará justamente eso (línea 32 abajo). Este método activará la onFailure () método en la devolución de llamada. 

Se puede llamar a este método, por ejemplo, si no hay conexión a Internet o cuando se produce una excepción inesperada al crear la solicitud o manejar la respuesta. Para saber si la solicitud fue cancelada, use el método está cancelado() en el Llamada clase (linea 20). 

llamada privada mCall; ... public sendPost (Título de la cadena, Cuerpo de la cadena) mCall = mAPIService.savePost (título, cuerpo, 1); mCall.enqueue (nuevo Callback() @Override public void onResponse (Llamar llamada, respuesta respuesta) if (response.isSuccessful ()) showResponse (response.body (). toString ()); Log.i (TAG, "publicación enviada a API." + Response.body (). ToString ());  @ Anular la anulación pública en caso de fallo (llamada call, Throwable t) if (call.isCanceled ()) Log.e (TAG, "solicitud abortada");  else Log.e (TAG, "No se puede enviar la publicación a la API.");  showErrorMessage (); );  public void cancelRequest () mCall.cancel (); 

Conclusión

En este tutorial, aprendió sobre la adaptación: por qué debería usarlo y cómo integrarlo en su proyecto para llevar a cabo ENVIARPONERBORRAR y cancelar solicitudes. También aprendiste a integrar RxJava con él. En mi próxima publicación en el uso de Retrofit, te mostraré cómo subir archivos. 

Para obtener más información sobre la modificación, consulte la documentación oficial. Y echa un vistazo a algunos de nuestros otros tutoriales y cursos sobre desarrollo de Android aquí en Envato Tuts+!

  • Animar su aplicación de Android

    Las animaciones se han convertido en una parte importante de la experiencia del usuario de Android. La animación sutil y bien elaborada se usa en todo el sistema operativo Android y puede hacer que su ...
    Ashraff Hathibelagal
    Desarrollo móvil
  • Concurrencia práctica en Android con HaMeR

    En este tutorial exploraremos el marco de trabajo de HaMeR (Handler, Message and Runnable), uno de los modelos de concurrencia más potentes disponibles en Android. Con un…
    Estaño megali
    SDK de Android
  • Codificación de aplicaciones funcionales de Android en Kotlin: cómo empezar

    ¿Escuchaste cosas positivas sobre el lenguaje Kotlin para aplicaciones de Android y quieres probarlo por ti mismo? Descubre cómo configurar y comenzar a codificar en este nuevo ...
    Jessica thornsby
    Android Studio
  • Migrar una aplicación de Android a Material Design

    Hace años, cuando Android aún era un sistema operativo móvil en ciernes, era bastante conocido por su fea interfaz de usuario. Porque no había diseño ...
    Ashraff Hathibelagal
    Androide