Retrofit para Android desde 0

Mauricio Collazos
contraslashsas
Published in
2 min readFeb 27, 2018

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();
}
}
});

--

--

Mauricio Collazos
contraslashsas

Master Student in Computer Science at Universidad del Valle. Software engineer, system administrator and speech technologies researcher