En este tutorial te enseñaré cómo construir un servicio Restful en Android usando Android Annotations v4.2. Utilizaré un servidor PHP como ejemplo.
Bibliotecas utilizadas:
- Anotaciones Android v4.2
- Spring Framework v2.0.0.M3 (versión Android)
- Jackson Databind v2.8.5
Si desea profundizar en los recursos descritos en este tutorial, le recomiendo que acceda a la siguiente documentación:
- https://github.com/androidannotations/androidannotations/wiki/Rest-API
- https://github.com/FasterXML/jackson-annotations
Para descargar el proyecto completo: RestApplication
El Webservice en PHP:
<?php /** * http://blog.masterdaweb.com * User: Lucas * Date: 17/12/2016 * Time: 14:22 */ ini_set("log_errors", 1); ini_set("error_log", "php-error.log"); $data = json_decode(file_get_contents("php://input")); switch ($_GET['acao']) { case 'buscar': header('Content-Type: application/json'); $output = json_encode( array( 'id' => $_GET['id'], 'nome' => 'Lucas', 'email' => '[email protected]', 'senha' => '123456' ) ); break; case 'cadastrar': header('Content-Type: application/json'); $output = json_encode( array( 'nome' => $data->nome, 'email' => $data->email, 'senha' => $data->senha ) ); break; case 'pagina-protegida': header('Content-Type: text/html'); session_start(); $output = session_id(); break; } echo $output;
Ahora la aplicación para Android
apply plugin: 'com.android.application' buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } android { compileSdkVersion 25 buildToolsVersion "25.0.1" defaultConfig { applicationId "com.example.lucas.restapplication" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } packagingOptions { exclude 'META-INF/spring.tooling' exclude 'META-INF/spring.handlers' exclude 'META-INF/spring.schemas' exclude 'META-INF/LICENSE' } } apply plugin: 'com.android.application' apply plugin: 'android-apt' def AAVersion = '4.2.0' dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:25.0.1' apt "org.androidannotations:androidannotations:$AAVersion" compile "org.androidannotations:androidannotations-api:$AAVersion" apt "org.androidannotations:rest-spring:$AAVersion" compile "org.androidannotations:rest-spring-api:$AAVersion" compile "org.springframework.android:spring-android-rest-template:2.0.0.M3" compile 'com.fasterxml.jackson.core:jackson-databind:2.8.5' }
La clase User descrita a continuación es nuestro Modelo, se enlazará con el webservice, esto es posible gracias a Jackson Bind:
@JsonIgnoreProperties(ignoreUnknown = true) public class Usuario implements Serializable { @JsonProperty("id") private int id; @JsonProperty("nome") private String nome; @JsonProperty("email") private String email; @JsonProperty("senha") private String senha; public Usuario(String nome, String email, String senha) { this.nome = nome; this.email = email; this.senha = senha; } public Usuario() { } public int getId() { return id; } public String getNome() { return nome; } public String getEmail() { return email; } public String getSenha() { return senha; } @Override public String toString(){ return "id: " + getId() + ", Nome: " + getNome() + ", email: " + getEmail() + ", senha: " + getSenha(); } }
Ahora definiremos nuestra clase Rest:
@Rest(rootUrl = "http://10.0.2.2", converters = {MappingJackson2HttpMessageConverter.class, StringHttpMessageConverter.class, FormHttpMessageConverter.class}) public interface MyRestClient { //Busca o recurso 'usuario' pelo id @Get("/rest.php?acao=buscar&id={id}") Usuario getUsuarioById(@Path int id); //Cadastra o recurso 'usuario' @Post("/rest.php?acao=cadastrar") Usuario postUsuario(@Body Usuario usuario); //Acessa página protegida usando ID da sessão PHP @Get("/rest.php?acao=pagina-protegida") @RequiresCookie("PHPSESSID") String paginaProtegida(); void setHeader(String name, String value); String getHeader(String name); void setCookie(String name, String value); String getCookie(String name); }
La IP 10.0.2.2 debe sustituirse por la dirección de su Webservice. Si estás usando un servidor localhost, mantén esta IP para que el emulador pueda acceder a localhost, porque si pones «localhost» en lugar de esta IP, el emulador no reconocerá tu entorno localhost.
@EActivity(R.layout.activity_main) public class MainActivity extends Activity { @RestService MyRestClient rest; @ViewById TextView getResponse, postResponse, sessaoResponse; Usuario getUsuario; Usuario postUsuario; String sessaoId; @AfterViews void load() { runRest(); } @Background void runRest() { getUsuario = rest.getUsuarioById(1); postUsuario = rest.postUsuario(new Usuario("Lucas Viana", "[email protected]", "123456")); rest.setCookie("PHPSESSID", "m1peg26asnb2o91a80q41n36q7"); sessaoId = rest.paginaProtegida(); setData(); } @UiThread void setData(){ getResponse.setText(getUsuario.toString()); postResponse.setText(postUsuario.toString()); sessaoResponse.setText(sessaoId); } }
Y, por último, nuestro punto de vista:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:layout_marginBottom="20dp" android:text="Blog.masterdaweb.com - Android Restful" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:text="GET:" /> <TextView android:id="@+id/getResponse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:textSize="18dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:text="POST:" /> <TextView android:id="@+id/postResponse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:textSize="18dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" android:text="SESSAO ID:" /> <TextView android:id="@+id/sessaoResponse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18dp" /> </LinearLayout>