Consumir Webservices con Android

SI ya llevas un tiempo programando en android, o eres nuevo y apenas haz visto cómo funcionan las peticiones http en android, te diremos que muchas veces se nos complica hacer nuestras propias clases para usar un asyctask que nos regrese el resultado etc etc.

No explicaremos como hacer el webservices si no como consumirlo, despues de esta acaracion veamos que necesitamos:

  1. Android Studio
  2. Emulador o teléfono con android (5.0 o superior)
  3. ultima version de Retrofit

Retrofit para consumir webservices

Retrofit es una “librería” donde podemos consumir webservices en android de forma muy sencilla, usando interface hace que las peticiones sean muy limpias.

una de las ventajas es que son asíncronas es decir que no ocupamos el hilo principal.

Implementar en nuestro proyecto

Cómo usamos android Studio vamos a abrir nuestro proyecto creado  ir a Gradle Scripts y abriremos build.gradle (Module: app).

Ahí colocaremos lo siguiente:

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

actualización julio 2018

Actualmente los proyectos de android cambiaron un poco su configuración del build, en este momento compile ya es obsoleto lo único que se tiene que hacer es cambiarlo por implement

Configuración nuevaConfiguración obsoletaComportamiento
implementationcompileLa dependencia está disponible en el momento de la compilación para el módulo y solo en el tiempo de ejecución para el consumidor del módulo. Para compilaciones grandes que abarcan varios proyectos, el uso de implementation en lugar de api o compile puede generar mejoras importantes en el tiempo de compilación, ya que reduce la cantidad de proyectos que el sistema de compilación debe volver a compilar. La mayoría de los módulos de apps y de prueba deben usar esta configuración.
apicompileLa dependencia está disponible para el módulo en el momento de la compilación, y también está disponible para el consumidor del módulo en el momento de la compilación y en el tiempo de ejecución. Esta configuración tiene el mismo comportamiento que compile (que ahora es obsoleta) y normalmente deberías usarla solo en los módulos de la biblioteca. Los módulos de la app deben usar implementation, a menos que desees exponer su API a otro módulo de prueba.
compileOnlyprovidedLa dependencia está disponible para el módulo solo en el momento de la compilación; no está disponible para sus consumidores en el momento de la compilación ni en el tiempo de ejecución. Esta configuración se comporta como provided (que ya es obsoleta).
runtimeOnlyapkLa dependencia está disponible para el módulo y sus consumidores solo en el tiempo de ejecución. Esta configuración se comporta como apk (que ya es obsoleta).

para mayor info este es la página oficial de android

actualmente esta es la configuración para retrofit 2.0

implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

 

La primera línea es la librería y la siguiente es una herramienta que usaremos mucho, ahora tenemos que dar rebuil al proyecto y podemos ir por un refresco para la espera.

Crearemos una clase nueva tipo interface

Esto nos sirve para definir hacia donde vamos a consultar y que vamos a consultar

por ejemplo yo hice lo siguiente:

public interface Login {
    @Headers({
            "Content-Type: application/json",
            "grant_type: password"
    })
    @POST("api/Person/login")
    Call<ResponseLogin> checkLogin(@Body CallLogin callLogin);

}

Login interface

Rojo: @Header es donde vamos a color la cabezera de nuestra peticion http, esto te dice el webservices que cabecera necesita para recibir una peticion

Azul: Tipo de petición, Existen varios yo estoy usando POST para login pero si necesitas usar otro son los siguientes:

@GET(“users/list”

@POST(“users/new”)

@PUT(“user/photo”)

y por último en amarillo:

Esto es la tarea que se va a crear, call<Responselogin> se trata sobre el modelo de datos que vamos a hacer y es el modelo de la respuesta del servidor.

luego ponemos un nombre de función en este caso checkLogin  dentro lleva @body que es la información que tomará para la consulta.

A continuación pongo los modelos que se crean para que puedan ver que trae cada modelo, se acuerdan de la segunda línea que pusimos en el gradle, ps se trata sobre una herramienta para poder serializar nuestros nombres de los modelos y poder colocar información de forma sencilla y entendible de la respuesta del servidor

ResponseLogin

public class ResponseLogin {
    @SerializedName("code")
    @Expose
    private Integer code;
    @SerializedName("messages")
    @Expose
    private List<String> messages = null;
    @SerializedName("content")
    @Expose
    private ContentLogin content;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public List<String> getMessages() {
        return messages;
    }

    public void setMessages(List<String> messages) {
        this.messages = messages;
    }

    public ContentLogin getContent() {
        return content;
    }

    public void setContent(ContentLogin content) {
        this.content = content;
    }

}

CallLogin

public class CallLogin {
    public CallLogin(String email, String password, String clientId) {
        this.email = email;
        this.password = password;
        this.clientId = clientId;
    }

    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("password")
    @Expose
    private String password;
    @SerializedName("client_Id")
    @Expose
    private String clientId;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getClientId() {
        return clientId;
    }

    public void setClientId(String clientId) {
        this.clientId = clientId;
    }
}

 

Como llamar nuestra clase de retrofit para consumir webservices

Actualmente tengo el boton de login, al momento de tocarlo instancia las clases, e inserto información.

para mayor comodidad comente el código importante

if(!e.equals("") || !p.equals("")){
//Instancio CallLogin que es mi modelo para enviar info al servidor
    CallLogin login = new CallLogin(e, p, directory.CLIENT_ID);
//Retrofit es la libreria principal
//baseUrl es la direccion especifica ejem: http://unprogramador.com
//addConverterFactory(GsonConverterFactory.create()) convierte Gson de retrofit a json (por decirlo asi)
    Retrofit retrofit = new Retrofit.Builder().baseUrl(directory.BASE_TEST).addConverterFactory(GsonConverterFactory.create()).build();    
    Retrofit.Login restLogin = retrofit.create(Retrofit.Login.class);
//Llamamos a la funcion Call de retrofit y pasamos los valores capturados
    Call callRest = restLogin.checkLogin(login);

//enqueue es una funcion que sirve para comprobar respuesta
    callRest.enqueue(new Callback<ResponseLogin>() {
        @Override
        public void onResponse(Call<ResponseLogin> call, Response<ResponseLogin> response) {
            switch (response.code()){
                case 200:
                    ResponseLogin rLogin = response.body();
                    Log.d("Respuesta", String.valueOf(rLogin.getCode()));
            }
        }

        @Override
        public void onFailure(Call<ResponseLogin> call, Throwable t) {

        }
    });

}


Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.