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:
- Android Studio
- Emulador o teléfono con android (5.0 o superior)
- 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 nueva | Configuración obsoleta | Comportamiento |
---|---|---|
implementation |
compile |
La 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. |
api |
compile |
La 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. |
compileOnly |
provided |
La 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). |
runtimeOnly |
apk |
La 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); }
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) { } }); }