Una sencilla llamada REST a PHP con Android

Hoy voy a compartir contigo una plantilla de código súper sencilla que realiza una llamada REST a un web service PHP que está corriendo en el lado del servidor.

Nube

Prerrequisitos para entender cómo funciona el código

  • Conocimientos básicos de Android
  • Conocimientos de TCP/IP
  • Conocimientos de HTTP

En esta ocasión no comentaré todos los pasos necesarios para entender qué hace cada línea. Si necesitas algo de ayuda te recomiendo que eches un vistazo a otros recursos que explican cómo hacer las cosas desde el principio. ¡Ánimo y suerte!

Código PHP de servidor

El método que corre en el server está escrito en PHP con Slim, como ves es una petición GET sencilla:

$app->get(
    '/foo/abc/',
    function () use ($app){
        print_r(json_encode(array(
            'status' => 'ok',
            'message' => 'Hello Android!')));
        exit;
    }
);

Allá va el código Android.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.programarivm.easyrest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="Easy REST" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillViewport="true"
    android:background="#FFFFFF"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        <Button
            android:paddingTop="10px"
            android:id="@+id/getServerData"
            android:text="Llamada REST"
            android:cursorVisible="true"
            android:clickable="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            />
        <TextView
            android:paddingTop="16px"
            android:id="@+id/responseTextView"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Respuesta: Aquí vendrá la respuesta del servidor." />
    </LinearLayout>
</ScrollView>

MainActivity.java

package com.programarivm.easyrest;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URI;

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;

public class MainActivity extends Activity {

    // properties
    private String url = "http://10.0.2.2/your_service_here/foo/abc/";
    // ui widgets
    private Button getServerData;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getServerData = (Button) findViewById(R.id.getServerData);

        getServerData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                new MyServerCall().execute(url);
            }
        });

    }

    private class MyServerCall extends AsyncTask<String, Void, Boolean> {

        // ui widgets
        private ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        private TextView responseTextView = (TextView) findViewById(R.id.responseTextView);
        // http communication
        private HttpClient client;
        private HttpGet request;
        private HttpResponse response;
        // server response
        private String json;

        protected void onPreExecute() {
            dialog.setMessage("Please wait..");
            dialog.show();
        }

        protected Boolean doInBackground(String... urls) {
            try {
                // http communication
                client = new DefaultHttpClient();
                request = new HttpGet();
                request.setURI(new URI(urls[0]));
                response = client.execute(request);
                // read response
                BufferedReader reader = new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent()));
                StringBuilder sb = new StringBuilder();
                String line = null;
                while((line = reader.readLine()) != null)
                {
                    sb.append(line + " ");
                }
                json = sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
            return true;
        }

        protected void onPostExecute(Boolean isOk) {
            dialog.dismiss();
            if(isOk) {
                responseTextView.setText(json);
            }
            else {
                responseTextView.setText("This request hasn't been processed, please try again.");
            }
        }

    }
}

¡Espero que el artículo de hoy te sirva de ayuda! He probado este código en varios dispositivos y funciona bien tanto en http como en https, con SSL.

¡Quiero dejar un comentario!

Recuerda que este es un blog sin comentarios. Si quieres decir alguna cosa por favor envíame un tuit o contacta conmigo vía Google+. ¡Muchas gracias!