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 y 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.
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
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
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<
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