Retrofit el mejor cliente REST para Android ^_^

La mayoría de las aplicaciones (si no es que todas) en la actualidad deben de conectarse con una API. (conjunto de funciones y procedimientos que cumplen una o muchas funciones con el fin de ser utilizadas por otro software) Claro que hay muchas opciones para hacer este consumo pero hoy yo te quiero hablar sobre Retrofit, que yo considero una muy buena manera de empezar con el consumo en Android.

¿Que es Retrofit?

Retrofit es un cliente REST para Android y Java, desarrollada por Square, muy simple y fácil de aprender. Permite hacer peticiones GET, POST, PUT, PATCH, DELETE y HEAD , gestionar diferentes tipos de parámetros y parsear automáticamente la respuesta a un POJO.

Supongamos que yo tengo una app android que se va a conectar a un servidor, lo que normalmente se hace es hacer una petición GET a una API la cual es una URL, lo que hará sera hacer una petición al servidor que le devolverá un JSON, entonces esto es muy fácil, lo único que tienes que hacer es importar la librería de Retrofit a tu app de Android, también se usa cualquier biblioteca HTTP para comunicarse con la solicitud y la respuesta el servidor y luego usar varios análisis sintácticos disponibles para analizar su respuesta de nuevo por ejemplo GSON que se encarga de analizar la respuesta del JSON, entonces veamos como funciona.

alt

Bueno para que entiendan un poco mas sobre Retrofit y como se usa hare un ejemplo consumiendo la API de Udacity. Como dije anteriormente Retrofit se usa para Java así que en este caso lo hare en Android.

  • Lo primero que tendremos que hacer sera abrir nuestro android studio y crear un nuevo proyecto, en mi caso le pondré el nombre de Retrofit. Escogeremos la version del SDK en la que va a correr nuestra aplicación, en mi caso usare KitKat pero ustedes pueden usar el que prefieran y seleccionaremos una Empty Activity.

  • Cuando estamos haciendo una app en android debemos de comprobar que nuestro archivo AndroidManifest.xml tenga permisos de Internet.

<uses-permission android:name="android.permission.INTERNET"/>

alt

  • y agregar a nuestro archivo build.gradle(Module: app) las librerías de Retrofit, esto lo saque de la pagina de Retrofit.

compile 'com.squareup.retrofit2:retrofit:2.2.0' compile 'com.squareup.retrofit2:converter-gson:2.2.0'

alt

  • Una ves agregadas estas lineas en sus respectivos archivos tendremos que crear una carpeta para los modelos que vamos a necesitar, en mi caso nombrare a mi carpeta con el nombre de modelos

alt

  • Dentro de la carpeta crearemos las clases que necesitaremos para hacer el consumo de retrofit, la primer clase que haremos la llamare Catalogo.

alt

  • Ahora pondremos lo siguiente dentro de nuestra clase Catalogo:

public List<Course> courses;

alt

  • Si te preguntas ¿Porqué Course? bueno es muy siempre iremos a ver la API de Udacity para entender porque este nombre.

alt

  • Como puedes ver es el mismo nombre que tiene la API de Udacity ya que cada biblioteca que haremos sera para recuperar los datos existentes.

alt

  • Lo siguiente sera crear la clase Course para poder especificar que datos vamos a traer, para esto lo hare apretando la combinación de teclas alt + enter para que nos de la opción de crearla y daremos enter y listo tenemos nuestra clase creada, en caso de que a ti no te agregué el public con ponérselo a mano es suficiente.

alt

  • Ya que tenemos nuestra clase ahora agregaremos las siguientes lineas para especificar que datos va a traer nuestra clase, en este caso yo traeré el titulo, y subtitulo de los cursos, dentro de esta hay otra lista, para eso es la tercera linea donde le decimos donde va a entrar para obtener esos datos.

public String title; public String subtitle; public List<Instructor> instructors;

alt

alt

  • De la misma manera crearemos la clase Instructor recuerden usar el alt + enter para agilizar la creación.

alt

  • Una ves creada traeremos los objetos que se encuentren dentro de la rama Instructors, básicamente lo que aquí usaremos sera un cliente https, en mi caso yo traeré el nombre del instructor.

public String name

alt

  • Ahora ya que llegamos a este punto necesitaremos la ayuda de una Interfaz (Una interfaz en Java es una colección de métodos abstractos y propiedades constantes. Osease sirve para heredar entre clases, usar variables de una a otra. Las interfaces son una forma de especificar qué debe hacer una clase sin especificar el cómo). Para crear la interfaz daremos click derecho sobre la carpeta principal de nuestras clases, nos iremos a nuevo y le daremos en Java Class, y cambiaremos la clase a interfaz, lo que haremos con esto es crear un servicio, por esa razón le pondré a mi interfaz Service.

alt

alt

  • En la interfaz le diremos la ubicación(URL) de donde va a traer los datos, y haremos una llamada al catalogo, entonces hara una consulta y lectura por lo cual usaremos el metodo GET.

public static final String BASE_URL = "https://www.udacity.com/public-api/v0/"; @GET("courses") Call<Catalogo> listaCatalogo();

alt

  • Y por ultimo no iremos al MainActivity para mostrar los datos. Lo primero que haremos sera traer el servicio de donde se traerá los datos de la URL y con el GsonConverterFactory es el que hará la magia al recibir los datos en JSON y los construirá. Luego con el servicio llamamos a la lista del catalogo, después simplemente llamaremos a los datos del catalogo de cursos, y mandaremos los mensajes a consola para comprobar que el consumo es exitoso, el primero Log sera por si no hay respuesta por parte del servidor, si no pasara y traerá los datos del titulo y subtitulo de los cursos que llegan en forma de String y de igual manera el nombre de el instructor y el ultimo Log simplemente sera para hacer una separación entre los datos recibidos y por ultimo el mensaje de Error.

private static final String TAG = "Funciona: ";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Retrofit retrofit  = new Retrofit.Builder()
            .baseUrl(Service.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    Service service = retrofit.create(Service.class);
    Call<Catalogo> requesCatalogo = service.listaCatalogo();

    requesCatalogo.enqueue(new Callback<Catalogo>() {
        @Override
        public void onResponse(Call<Catalogo> call, Response<Catalogo> response) {
            if (!response.isSuccessful()){
                Log.i("TAG", "Error" + response.code());
            }else {
                Catalogo catalogo = response.body();
                for (Course c : catalogo.courses){
                    Log.i(TAG, String.format("%s: %s", c.title, c.subtitle));

                    for (Instructor i : c.instructors){
                        Log.i(TAG, i.name);
                    }
                    Log.i(TAG, "-------------");
                }
            }
        }

        @Override
        public void onFailure(Call<Catalogo> call, Throwable t) {
            Log.e(TAG, "Error: " + t.getMessage());
        }
    });
}

alt

  • Y listo solo queda comprobar el consumo desde el logcat de android al correr el proyecto y si todo salió bien tendrás algo como esto en tu monitor y con esto terminamos muy sencillo o bueno quizá no si eres nuevo en esto pero créeme que es sencillo a comparación de otra maneras tradicionales.

alt