Cómo consumir un servicio REST en una aplicación Android

Los servicios REST son ideales para proporcionar contenido a dispositivos pequeños como smartphones y tablets. De hecho, si has interactuado con alguna API basada en la nube en los últimos años, es muy probable que esa API se haya expuesto a través de una interfaz REST. Existen numerosos documentos en la web que explican qué constituye un servicio REST y cómo implementarlo. También hay varios tutoriales que explican cómo consumir servicios REST desde un cliente. Sin embargo, una solicitud común que veo en los foros de Android es de ejemplos de consumidores REST específicos de Android basados en Java.

Recientemente, mi hijo y yo lanzamos una actualización para nuestro juego, la cual incluía una tabla de clasificación en línea. El código del servidor es bastante simple: lleva el registro de los cinco mejores puntajes en cada uno de los 40 niveles. Debido a su ligereza y relativa facilidad de implementación, expuse la tabla de clasificación en mi aplicación (y en cualquier persona interesada) a través de una llamada HTTP GET RESTful. Por ejemplo, para ver los cinco mejores jugadores en el nivel #1, simplemente abre esta URL en cualquier navegador: http://www.cheesejedi.com/rest_services/get_big_cheese?level=1.

Figura A

Llamar a un punto de enlace REST desde una aplicación Android requiere enviar una solicitud HTTP al hilo de fondo y luego analizar los resultados en el hilo de la interfaz de usuario. No es muy difícil una vez que lo ves explicado detalladamente, pero a veces puede ser un poco complicado empezar.

Este tutorial incluye una versión simplificada del código que realmente se utilizó en mi aplicación en producción. Esperemos que te resulte útil para empezar con tus propios consumidores REST en Android. Puedes seguir el tutorial paso a paso, o descargar el proyecto completo para importarlo en Eclipse.

Índice de Contenido
  1. Paso 1: Crear un nuevo proyecto de Android en Eclipse
  2. Paso 2: Crear un recurso main.xml en la carpeta /res/layout
  3. Paso 3: Agregar el permiso de acceso a internet en el archivo AndroidManifest.xml
  4. Paso 4: Implementar el código en Main.java
  5. Paso 5: Implementar la clase LongRunningGetIO en Main.java

Paso 1: Crear un nuevo proyecto de Android en Eclipse

Crea un nuevo proyecto de Android en Eclipse. Elige un Target SDK 1.6 o superior, y asegúrate de renombrar la actividad de inicio como Main.java.

Cómo prevenir huellas y manchas en las pantallas de las tablets

Paso 2: Crear un recurso main.xml en la carpeta /res/layout

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Http GET Demo"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="GET"
        android:id="@+id/my_button"/>
    <EditText
        android:layout_margin="20dip"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minLines="15"
        android:maxLines="15"
        android:textSize="12sp"
        android:editable="false"
        android:id="@+id/my_edit"/>
</LinearLayout>

Paso 3: Agregar el permiso de acceso a internet en el archivo AndroidManifest.xml

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.authorwjf.http_get"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="4" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Paso 4: Implementar el código en Main.java

Main.java
package com.authorwjf.http_get;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class Main extends Activity implements OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.my_button).setOnClickListener(this);
    }
    @Override
    public void onClick(View arg0) {
        Button b = (Button)findViewById(R.id.my_button);
        b.setClickable(false);
        new LongRunningGetIO().execute();
    }
}

Paso 5: Implementar la clase LongRunningGetIO en Main.java

Main.java
private class LongRunningGetIO extends AsyncTask <Void, Void, String> {
    protected String getASCIIContentFromEntity(HttpEntity entity) throws IllegalStateException, IOException {
        InputStream in = entity.getContent();
        StringBuffer out = new StringBuffer();
        int n = 1;
        while (n>0) {
            byte[] b = new byte[4096];
            n =  in.read(b);
            if (n>0) out.append(new String(b, 0, n));
        }
        return out.toString();
    }
    @Override
    protected String doInBackground(Void... params) {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpGet httpGet = new HttpGet("http://www.cheesejedi.com/rest_services/get_big_cheese.php?puzzle=1");
        String text = null;
        try {
            HttpResponse response = httpClient.execute(httpGet, localContext);
            HttpEntity entity = response.getEntity();
            text = getASCIIContentFromEntity(entity);
        } catch (Exception e) {
            return e.getLocalizedMessage();
        }
        return text;
    }
    protected void onPostExecute(String results) {
        if (results!=null) {
            EditText et = (EditText)findViewById(R.id.my_edit);
            et.setText(results);
        }
        Button b = (Button)findViewById(R.id.my_button);
        b.setClickable(true);
    }
}

La demostración debería estar lista para probar. Sube el archivo APK a un emulador y presiona el botón. Si tienes una conexión a internet y el servidor no está sobrecargado de solicitudes, deberías obtener una respuesta. La demostración no realiza ninguna manipulación en la cadena de resultados, pero debería ser claro lo fácil que sería incluir los resultados en un arreglo JSON y mostrarlos de manera significativa.

Figura B

¡Felicitaciones! ¡Acabas de consumir un servicio RESTful desde tu dispositivo Android!

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Móvil, allí encontraras muchos artículos similares a Cómo consumir un servicio REST en una aplicación Android , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.