Acceso a servicios REST: Primer ejemplo Hola Mundo

Hasta el momento hemos construido aplicaciones que funcionan dentro del entorno de nuestro dispositivo. Ahora vamos a establecer una comunicación con un nodo remoto, que ofrece un servicio a través de la web. 

Un saludo REST

En nuestro primer ejemplo vamos a acceder a un servicio REST que está en un Web Server externo:
(extraído de este artículo: http://spring.io/guides/gs/rest-service/)

Esto nos devuelve un saludo, en formato JSON (Javascript Object Notation):
  1. {
  2. "id": 40530,
  3. "content": "Hello, World!"
  4. }

¿Qué características tiene un servicio REST?

Pueden leerlo en esta página.

El cliente

Vista

La vista principal de nuestra aplicación Android es simple, cuenta con dos TextView que permiten visualizar id y contenido del saludo.

Definición de un service

Utilizaremos el framework Retrofit que nos va a facilitar la llamada al servicio externo. Generamos entonces una interfaz Java que dice cómo vamos a acceder al web service:

public interface GreetingService {
    @GET("/greeting")
    Call<Greeting> getGreeting();
}

  • la annotation @GET define que vamos a hacer el request mediante un método GET
  • también debemos definir el path al que vamos a acceder dentro del server
    • en nuestro caso es "/greeting" completando la URL base que será http://rest-service.guides.spring.io, eso termina formando "http://rest-service.guides.spring.io/greeting"
  • en Retrofit 2.0 las llamadas pueden ser sincrónicas o asincrónicas
    • entonces el método getGreeting devuelve un Call, 
      • call.execute() invoca al servicio REST en forma sincrónica
      • call.enqueue() invoca al servicio REST en forma asincrónica, necesita por eso...
    • ... un callback como parámetro, que es un command que nos dice qué debemos hacer cuando el servidor responda con un saludo
    • este saludo se representa con un objeto nuevo: Greeting, que tenemos que codificar
    • la buena noticia es que no tenemos que recibir el JSON y convertirlo a un Greeting, esto lo hace retrofit utilizando como convención las propiedades del JSON devuelto. Si el JSON devuelve un objeto con propiedades id y content, es obvia la implementación de Greeting:
public class Greeting {

    private String id;
    private String content;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

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

Llamada al service desde la activity (el controller)

La aplicación al iniciar construye:
  • un objeto Retrofit, que maneja la conexión generando la URI
  • un objeto Service, que se decora en base a la definición de nuestro GreetingService
  • un objeto Call, que maneja la llamada asincrónica y la conversión a nuestro objeto Greeting
   @Override
    protected void onStart() {
        super.onStart();

        final String BASE_URL = "http://rest-service.guides.spring.io/greeting";
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        GreetingService service = retrofit.create(GreetingService.class);

        Call<Greeting> call = service.getGreeting();
        call.enqueue(new Callback<Greeting>() {
            @Override
            public void onResponse(Response<Greeting> response, Retrofit retrofit) {
                Greeting greeting = response.body();
                TextView greetingIdText = (TextView) findViewById(R.id.lblId);
                TextView greetingContentText = (TextView) findViewById(R.id.lblContent);
                greetingIdText.setText(greeting.getId());
                greetingContentText.setText(greeting.getContent());
            }

            @Override
            public void onFailure(Throwable t) {
                Log.e("HelloWorld", t.getMessage());
            }
        });
    }


Modificaciones en el Manifest

En el AndroidManifest debemos indicar que necesitamos el permiso del usuario para conectarnos a Internet:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.uqbar.holamundo_rest_android_studio" >

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

Arquitectura general


Material de lectura adicional


Comments