Retrofit para Android desde 0
Retrofit es una librería maravillosa para hacer llamadas red y obtener el resultado estructurado de una vez. La labor manual de utilizar un HttpClient y luego usar json.get para construir nuestros objetos es cosa del pasado con Retrofit.
Primero, añadamos las dependencias necesarias en app/build.gradle
:
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.google.code.gson:gson:2.8.2'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
Para este caso usaremos gson aunque existen otros serializadores soportados, los cuales se encuentran en la página oficial .
Para darle el uso correcto a Retrofit, necesitaremos clases que representen nuestras entidades en un formato POJO. Para evitar dolores de cabeza con tipos, recomiendo utilizar jsonschema2pojo, una herramienta online que genera clases POJO en Java a partir de un objeto JSON (No olvides definir bien el nombre de paquete, que el lenguaje sea Java, que el estilo de anotaciones sea GSON y añadir los getters y setters).
Retrofit va a requerir que creemos dos archivos especiales, una interfaz y un cliente.
En la interfaz vamos a definir la estructura de nuestras peticiones. Ejemplificaremos con dos ejemplos:
GET:
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@GET("batch/{id}/")
Call<Batch> getBatch(@Path("id") int batch_id);
POST:
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@POST("batch/{id}/add-item")
Call<Batch> addItem(@Path("id") int batch_id, @Body Item item);
Las clases Batch
e Item
fueron generados previamente.
En el cliente vamos a envolver cada función de la interfaz para que sea llamada por medio de una instancia de retrofit:
public class ApiClient {
public ApiClient(Context context) {
this.context = context;
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
} public Call<Batch> getBatch(int id) {
ApiService service = retrofit.create(ApiService.class);
return service.getBatch(id);
}
public Call<Batch> addItem(int id, Item item) {
ApiService service = retrofit.create(ApiService.class);
return service.addItem(id, item);
}
}
Como estaremos accediendo a Internet, no olvidemos solicitar el permiso de Internet en nuestro app/src/main/AndroidManifest.xml
dentro del nodo manifest
<uses-permission android:name="android.permission.INTERNET" />
Por último en nuestras actividades podremos llamar nuestro cliente y obtener la información requerida con el siguiente código
ApiClient apiClient = ApiClient(this)final Call<Batch> batch =apiClient.getBatch(batch_id);
batch.enqueue(new Callback<Batch>() {
@Override
public void onResponse(@Nullable Call<Batch> call, @Nullable Response<Batch> response) {
if (response != null && response.body() !=null)
{
BatchDetail.this.batch = response.body();
updateUI();
}
}
@Override
public void onFailure(@Nullable Call<Batch> call, @Nullable Throwable t) {
if(t!=null)
{
t.printStackTrace();
}
}
});