logo principal

Llamadas REST-API en Java

Vamos a ver como consumir una API REST, que es una interfaz de programación que aplica un conjunto de límites de la arquitectura REST.

Para realizar estas llamadas vamos a utilizar la librería Retrofit2. Se trata de una librería que nos permite hacer peticiones HTTP, gestionar los parámetros de la petición y parsear de forma automática la respuesta a un tipo datos.

criptografia

A continuación vamos a ver un ejemplo en el que haremos llamadas a un servicio API REST, en concreto PokeApi, que nos permite hacer estas llamadas sin necesidad de tener una key. Este ejemplo imprimirá la id del pokemon y su nombre.

Lo primero que necesitamos hacer es importar Retrofit2, para ello puedes descargar la librería desde Retrofit2, o puedes utilizar Maven o Gradle. En mi caso yo usaré Gradle e implementaré las siguientes dependencias en el archivo build.gradle.



implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.8.0'
                    
                

Una vez ya instalado vamos a pasar a definir el modelo de datos. La respuesta a nuestra llamada nos devolvera un Array de Pokemon, y estos Pokemon contendrán el nombre y la URL de la imagen. Por lo que quedaría tal que así.



public class Pokemon {

    private String name;
    private String url;

    public String getName() {
        return name;
    }

    public String getUrl() {
        return url;
    }
}
                    
                


public class PokemonList {

    private ArrayList<‍Pokemon> results;

    public ArrayList<‍Pokemon> getPokemonList() {
        return results;
    }
}                    
                    
                

Ahora vamos a crear una clase llamada PokemonApi, que contendrá la url base de la web, creará la instancia de retrofit y nos permitira acceder al servicio.



public class PokemonApi {

    public static String url = "http://pokeapi.co/api/v2/";

    public static Retrofit builder(String url){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit;
    }

    public static PokemonService getPokemonService(){
        return PokemonApi.builder(url).create(PokemonService.class);
    }
}                                   
                    
                

A continuación vamos a crear la interfaz PokemonService, que tendrá un método para obtener la lista de Pokemon. Este método recibirá un parámetro que indicará cuantos Pokemon queremos mostrar. Para ver todos los parámetros que soporta la api, puedes encontrarlos en la documentación oficial de PokeApi



public interface PokemonService {

    /*  "pokemon" es la continuación de la url base por lo que la url
    *   quedaría tal que asi -> http://pokeapi.co/api/v2/pokemon
    */
    @GET("pokemon")
    Call<‍PokemonList> getPokemonListResult(@Query("limit") int limit);
    
}                  
                    
                

Con esto ya estaría todo preparado para realizar las llamadas.



public static void main(String[] args) {
    //  Creamos el servicio
    PokemonService service = PokemonApi.getPokemonService();
    //  Establecemos en esta variable cuantos pokemon queremos mostrar, en este caso 100
    int limit = 100;
    //  Creamos la llamada usando el método getPokemonListResult() del servicio
    Call<‍PokemonList> pokemonListCall = service.getPokemonListResult(limit);

    /*  Ponemos la llamada en la cola. onResponse() se ejecutará si hemos obtenido los datos y
    *   onFailure() si se ha producido un error
    */
    pokemonListCall.enqueue(new Callback<‍PokemonList>() {
        @Override
        public void onResponse(Call<‍PokemonList> call, Response<‍PokemonList> response) {
            if(response.isSuccessful()){
                PokemonList pokemonList = response.body();
                int counter = 1;
                for(Pokemon pokemon : pokemonList.getPokemonList()){
                    System.out.println(counter + "- " + pokemon.getName());
                    counter++;
                }
            }else{
                System.out.println(response.errorBody());
            }
        }

        @Override
        public void onFailure(Call<‍PokemonList> call, Throwable t) {
            System.out.println("Error al recuperar los datos");
        }
    });
}

                

El resultado sería el siguiente. El resultado que nos muestra son los 100 primeros Pokemon, que son los que hemos establecido en el límite.

Resultado.