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). OBTENER
, ENVIAR
, PONER
, PARCHE
, 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:
com.squareup.retrofit: converter-gson
com.squareup.retrofit: convertidor-jackson
com.squareup.retrofit: convertidor-moshi
Para los buffers de protocolo, Retrofit soporta:
com.squareup.retrofit2: converter-protobuf
com.squareup.retrofit2: cable convertidor
Y para XML Retrofit, soporta:
com.squareup.retrofit2: converter-simpleframework
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..
Inicie Android Studio y cree un nuevo proyecto con una actividad vacía llamada Actividad principal
.
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.
Para realizar operaciones de red, necesitamos incluir el INTERNET
Permiso en el manifiesto de aplicación: AndroidManifest.xml.
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.
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 CallsavePost (@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
.
@Cuerpo
AnotaciónTambié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 CallsavePost (@Body Post post);
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 /
.
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..
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
.
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 ()
y 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.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.
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:
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'
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;
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 ObservablesavePost (@Field ("title") String title, @Field ("body") String body, @Field ("userId") long userId);
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.
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..
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 CallupdatePost (@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)
.
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") LlamadadeletePost (@Path ("id") id largo);
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 privadamCall; ... 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 ();
En este tutorial, aprendió sobre la adaptación: por qué debería usarlo y cómo integrarlo en su proyecto para llevar a cabo ENVIAR
, PONER
, BORRAR
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+!