No hace mucho escribía un post sobre Retrofit y cómo ponerlo a funcionar. Hoy vamos a hacer unas consultas sencillas para que veáis qué sencillo es conseguir datos de internet con esta librería.

Haremos consultas sobre mi propio repositorio Github, recién estrenado para estos posts. La dirección del respositorio es: https://api.github.com/users/galideas[…].

La dirección base será: https://api.github.com/

Para poder hacer consultas rest usaremos ahora que completa la dirección, que será users/galideas/…

Para un tutorial sobre todas las consultas REST que permite Github podéis mirar aquí.

  1. Consigamos la lista de repos de este usuario

La dirección de consulta de los repos es http://api.github.com/users/galideas/repos

Como veis el usuario aparece como parámetro en la url, así que vamos a incluir un parámetro en nuestra llamada. Al querer descargar datos, nuestra consulta será de tipo GET. Así, en nuestro servicio esta vez aparecerá:

public interface RetrofitService {

    @GET("users/{user}/repos")
    Call<List<Repository>> loadUserRepository(@Path("user") String user);

}

Hemos incluido {user} que es el que será el parámetro variable (lo pasaremos en la llamada al método) y en GET, incluimos el parámetro @Path(“user”) para indicar a retrofit que sustituya el dónde poner “user” ({user}) en la llamada con un parámetro String user que yo le voy a pasar.

Abrid el navegador y copiar la dirección completa, se devuelve un array (veréis que empieza por [ ) de objetos (dentro cada grupo está contenido entre {} ) Json, por eso mi retorno es una lista (List) de objetos Repository (List).

Voy a definir el objeto Repository, cogiendo dos datos que me interesan

direccionGithub

el id, que será de tipo long y el full_name que será de tipo String. El Repository quedará:

public class Repository {

    @SerializedName("full_name")
    private String fullName;
    private long id;

    public String getFullName() {
        return fullName;
    }

    public long getId() {
        return id;
    }
}

Ojo al dato. El nombre de las variables debe coincidir con el del Json devuelto si no, no podrá guardarlo. El long id no es un problema pero quiero seguir la recomendación java y nombrar full_name como fullName. Gson nos provee de la funcionalidad @SerializedName que nos permite relacionar cualquier nombre con el del Json devuelto. En este caso relaciono fullName -> full_name.

Y ahora la llamada. En mi método main:

call = service.loadUserRepository("galideas");
call.enqueue(new Callback<List<Repository>>() {
    @Override
    public void onResponse(Call<List<Repository>> call, Response<List<Repository>> response) {
        for (Repository repo : response.body()){
            System.out.println(repo.getId() + ": " + repo.getFullName());
        }
    }

    @Override
    public void onFailure(Call<List<Repository>> call, Throwable t) {
        System.out.println(t.getCause().toString());
    }
});

Al llamar al servicio le paso el parámetro del nombre de usuario: service.loadUserRepository (“galideas”) <- recordad que esperaba un String así que todo bien.

Ahora me devuelve un List<Repository> y para cada objeto Repository repo que haya en el cuerpo de la respuesta (response.body()) pues imprimo los datos que recoge mi objeto Repository (el id con getId() y el full_name con getFullName()).

La salida será:

direccionGithub_2

He decidido ir haciendo post más cortos para que sean más rápidos de leer y probar así que con esto, lo damos por listo hoy, en breve más.

Anuncios