Ir al contenido principal

Desarrollo en Android T16 – Consumir datos desde un REST Webservice

Desarrollo en Adroid T 16 – Consumir datos desde un REST Webservice


La comunicación entre Android y un webservice se puede realizar de diferentes formas, de las más utilizadas son SOAP REST; en este ejemplo se realizará la comunicación a través de un servicio web utilizando la arquitectura Representational State Transfer REST, codificando la información envida utilizando Json.

Para esta practica se crea un nuevo proyecto con el nombre AgendaREST que contiene un Activity donde se mostrarán los registros de la tabla contactos, almacenada en una base de datos en un servidor local o remoto.

En este entrada no se profundizará sobre los servicios web utilizando REST, es una introducción a su uso y aplicación practica en una App para Android.


0. Crear la base de datos agenda, tomando como base el siguiente script.

CREATE DATABASE agenda;

USE agenda;

CREATE TABLE  contactos (
  id_contacto int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  nombre varchar(400) NOT NULL,
  telefono varchar(100) NOT NULL,
  email varchar(100) NOT NULL
);

INSERT INTO contactos (nombre,telefono,email) VALUES ("Dejah Toris","123456","dejah@barson.mar");
INSERT INTO contactos (nombre,telefono,email) VALUES ("John Carter","123456","john@barson.mar");
INSERT INTO contactos (nombre,telefono,email) VALUES ("Carthoris","4568","carthoris@barson.mar");

1. Una vez creada la base de datos en el servidor, se crea un archivo PHP de nombre getAllContacts.php, cuya función es conectarse con la base de datos y realizar una consulta donde se devuelvan todos los campos de la tabla contactos, los cuales se almacenarán temporalmente en un arreglo, que finalmente será impreso en formato json utilizando la función json_encode() de PHP.

$db_host = "localhost";
     $db_name = "agenda";
     $db_user = "root";
     $db_password = "1234";
    
     $connection = mysql_connect($db_host, $db_user, $db_password) or die("Connection Error: " . mysql_error());
    
mysql_select_db($db_name) or die("Error al seleccionar la base de datos:".mysql_error());
    @mysql_query("SET NAMES 'utf8'");

$sql_query = "SELECT * FROM contactos;";
$result = mysql_query($sql_query);
$rows = array();
while($r = mysql_fetch_assoc($result)) {
  $rows[] = $r;
}
print json_encode($rows);
?>



2.- En la interfaz gráfica de la App de Android se agrega un TextView con un titulo para el Activity, además de insertar un ListView, este último componente será utilizado para mostrar los registros que regresará el webservice.


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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.sax.agendarest.ContactsActivity">
    <TextView
        android:id="@+id/tv_title"
        android:text="@string/title"
        android:textAlignment="center"
        android:textSize="20dp"
        android:textColor="@color/colorPrimary"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <ListView
        android:textColor="@color/colorValues"
        android:id="@+id/lv_contacts_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>
</LinearLayout>


El layout se verá como se muestra en la siguiente imagen.




3.- Dentro del Activity se necesitan importar las siguientes librerías, estas permiten realizar la conexión a Internet mediante HTTP, además de permitir almacenar el resultado en un buffer para posteriormente realizar una conversión (parse) para separar la información recibida.

import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;


4.- Dentro de la clase principal se crean las siguientes variables:

lv_contacts_list para tener acceso a la lista que se creo en el Layout.

adapter que es un ArrayAdapter encargado de almacenar los registros que se mostrarán en el ListView.

getAllContactsURL es una cadena de texto que contiene la dirección URL a la que se realizará la conexión, es importante saber que no se debe utilizar localhost o 127.0.0.1 como parte de la dirección URL, en su lugar se utiliza la dirección IP asignada a la tarjeta de red, si es de forma local el dispositivo móvil y el servidor deben estar en la misma red, y en caso de ser remoto el dispositivo móvil debe tener acceso a Internet.

private ListView lv_contacts_list;
private ArrayAdapter adapter;
private String getAllContactsURL "http://192.168.0.23/agenda_rest/webservices/getAllContacts.php";

5.- Como se utilizará Internet para el envío de la información se debe dar permiso a la aplicación para consumir datos, para hacer esto se agrega la siguiente linea dentro del archivo Manifest.xml de la aplicación, arriba de la etiqueta .

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



6.- Dentro del método  onCreate del Activity se agrega la línea siguiente, que le indica a la aplicación que se establecerá una conexión externa y que de permiso de mantenerla abierta.

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());



7.- También dentro del método  onCreate se inician las variables declaradas al inicio, inicializando el adapter  con un simple_list_item_1, lo que permitirá agregar tantos items al ListView como contactos existan.

lv_contacts_list = (ListView)findViewById(R.id.lv_contacts_list);
adapter new ArrayAdapter(this, android.R.layout.simple_list_item_1);
lv_contacts_list.setAdapter(adapter);


8.- Para realizar la petición de conexión y el almacenamiento de la información que regrese el webservice, los datos recibidos se almacenan en forma de lineas, por lo que posteriormente se requiere un parseo para separar cada uno de los campos.

En la variable  bufferedReader al utilizar el método  InputStreamReader y la conexión creada, almacena los datos que regresa el webservice.

Posteriormente en la variable  webServiceResult se realiza la lectura de los datos y la concatenación de de los mismo en una cadena de tipo String, que será parseada en formato json utilizando el método  parseInformation(String) que se creará más adelante.

private void webServiceRest(String requestURL){
    try{
        URL url = new URL(requestURL);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line = "";
        String webServiceResult="";
        while ((line = bufferedReader.readLine()) != null){
            webServiceResult += line;
        }
        bufferedReader.close();
        parseInformation(webServiceResult);
    }catch(Exception e){
        e.printStackTrace();
    }
}


9.- El método  parseInformation(String jsonResult) recibe una cadena String y la almacena en un array de tipo JSONArray, lo que permite separar los campos y valores de la cadena.

Utilizando un bucle for se recorre el arreglo y se insertan en el adapter  la concatenación de los campos deseados, utilizando la línea adapter.add(id_contacto + “: “ + nombre);

private void parseInformation(String jsonResult){
    JSONArray jsonArray = null;
    String id_contacto;
    String nombre;
    String telefono;
    String email;
    try{
        jsonArray = new JSONArray(jsonResult);
    }catch (JSONException e){
        e.printStackTrace();
    }
    for(int i=0;i<jsonArray.length();i++){
        try{
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            id_contacto = jsonObject.getString("id_contacto");
            nombre = jsonObject.getString("nombre");
            telefono = jsonObject.getString("telefono");
            email = jsonObject.getString("email");
            adapter.add(id_contacto + “: “ + nombre);
        }catch (JSONException e){
            e.printStackTrace();
        }
    }
}


10.- Para que todo funcione como última línea del método onCreate del Activity se agrega la siguiente línea, después de esto se compila y se instala en el dispositivo móvil la App creada, el resultado será que se muestren todos los registros que contenga la tabla contactos.

webServiceRest(getAllContactsURL);


11. Al ejecutar la App el resultado se ve como en la siguiente imagen. 

Agenda REST



Comentarios

Entradas más populares de este blog

Creación de Librerías en Java

Creación de Librerías en Java   Las librerías son un conjunto de clases con funciones especificas que ayudan a desarrollar aplicaciones más complejas de una forma sencilla, por ejemplo si se requiere realizar cálculos matemáticos y emplear el funciones como el Seno o Coseno, simplemente se importa la librería Math y se utilizan estos métodos, en lugar de desarrollarlos. Java cuenta con una extensa lista de librerías disponibles dentro del JDK o desarrolladas por terceros, pero también existe la posibilidad de desarrollar librerías propias para reutilizar de forma más eficiente el código, por ejemplo si se trabaja de forma cotidiana con conexión a base de datos, se pueden desarrollar métodos genéricos que realicen la conexión, que validen las consultas, etc. de forma que su uso reduzca el tiempo de desarrollo e incremente la productividad. Para este tutorial se van a crear dos proyectos en NetBeans, uno sera la librería y el otro proyecto hará uso de esta.

Elegir la clase a ejecutar en NetBeans, MVC

Elegir la clase a ejecutar en NetBeans Para que java pueda ejecutar una aplicación esta debe tener un método conocido como punto de entrada, este método tiene la sintaxis: void static void main(String [] sax){ //código } En ocasiones en una aplicación tiene varios puntos de entrada, que pueden servir para probar diferentes partes de la aplicación sin tener que recorrer o pasar por varias clases, para esto se puede seleccionar directamente en las propiedades del proyecto que clase será la principal.

Librerías JOptionPane para generar ventanas de entrada y salida de datos

Para poder introducir datos leídos desde el teclado existen varias formas, una de ellas hace uso de la librería javax.swing.JOptionPane que entre otras opciones permite mostrar ventanas para introducir datos, y ventanas para mostrar valores. Con el uso de esta librería se crean pequeñas interfaces definidas por el sistema, pero ya se hace uso de las librerías graficas swing, que se verán más adelante.