Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Android / Conexión RESTFUL con android y JSON

Conexión RESTFUL con android y JSON

Autor jc mouse viernes, noviembre 21, 2014

En este tutorial crearemos una sencilla aplicación android que nos permitirá conectarnos a un RESTFUL, obtener un resultado, procesar y mostrar en pantalla.

Repasando algunos conceptos antes de comenzar

Representational State Transfer – REST

La Transferencia de Estado Representacional (Representational State Transfer) o REST es una técnica de arquitectura software para sistemas hipermedia distribuidos como la World Wide Web.

Los sistemas que siguen los principios REST se llaman con frecuencia RESTful. [wikipedia]

JSON

Acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML. [wikipedia]

Ejemplo:

{"menu": {
   "id": "file",
   "value": "File",
   "popup": {
     "menuitem": [
       {"value": "New", "onclick": "CreateNewDoc()"},
       {"value": "Open", "onclick": "OpenDoc()"},
       {"value": "Close", "onclick": "CloseDoc()"}
     ]
   }
 }
}

Que necesitamos

  • IDE Eclipse con SDK Android instalado
  • Conocimientos sobre Java, PHP, JSON
  • Servidor (local o en internet)

Nivel: Intermedio

Tiempo: 20 minutos

PROYECTO

1. Antes de entrar con la programación en Android, debemos preparar el servidor de pruebas, no construiremos un RestFul como tal, no es el objetivo de este tutorial, sin embargo con unas cuantas lineas de código en php podemos imitar la respuesta que este servicio nos puede entregar.

En nuestro servidor creamos un archivo php en la dirección por ejemplo http://tuservidor/restful/datos.php (ojo con esta url porque la usaremos más adelante), una vez creado este archivos, pegamos el siguiente código:

<?php

$data1 = array('nombre'=>'Benito','apellido'=>'Camelo');
$data2 = array('nombre'=>'Rosa Mela','apellido'=>'Cabeza');
$data3 = array('nombre'=>'Yola','apellido'=>'Prieto');

$data = array( $data1, $data2, $data3 );

$datares = array( 'status'=>200, 'Registros'=>$data );

print (json_encode( $datares ) );

?>

Este pequeño código crea unos datos en formato JSON

{
  "status": 200,
  "Registros": [
    {
      "nombre": "Benito",
      "apellido": "Camelo"
    },
    {
      "nombre": "Rosa Mela",
      "apellido": "Cabeza"
    },
    {
      "nombre": "Yola",
      "apellido": "Prieto"
    }
  ]
}

Podemos observar que esta formado por un campo llamado status y un array que contiene 3 registros.  el campo llamado status tiene un valor de 200 esto es para indicarle a la aplicación que se tuvo éxito en realizar la acción en el server, esta forma de devolver los resultados es una «buena practica» que se usa en los APIS puedes leer más sobre estos códigos en List of HTTP status codes

Podemos hacer uso de herramientas online para poder apreciar mejor como están distribuidos los datos en JSON, por ejemplo usando la herramienta online  jsonviewer tenemos:

json viewer

Ahora que tenemos listo nuestro servidor de pruebas, continuamos con el paso #2

2. Crea un nuevo proyecto Android en Eclipse que llamaremos RestFulBasic,  mantendremos el MainActivity que se crea  por defecto y añadiremos una clase que llamaremos MyRestFul, debes tener algo como esto:

restful basic

3. LAYOUT

Abre el archivo activity_main.xml y pega el siguiente código xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    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=".MainActivity" >

    <Button
        android:id="@+id/btnRF"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/strButton" />

    <EditText
        android:id="@+id/txtRespuesta"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"        
        android:ems="10"
        android:inputType="textMultiLine" >

        <requestFocus />
    </EditText>  

</LinearLayout>

Nuestra interfaz esta compuesta por un botón para iniciar la conexión con el servidor y una caja de texto donde mostrar el resultado obtenido

Abre también el archivo strings.xml y añade:

<string name="strButton">Test</string>

Guarda todo y continuemos 🙂

4. PERMISOS

Hacemos uso de permisos de INTERNET por lo que debemos añadir el mismo en el archivo AndroidManifest.xml

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

5. MyRestFul

Para conectarnos con el servidor desde android debemos hacer uso de un hilo paralelo al hilo principal, esto porque no queremos que nuestra aplicación se quede colgada esperando el resultado del servidor y porque android no deja ejecutar este tipo de tareas en el hilo principal. Para realizar esta tarea nos valemos de la clase AsyncTask  que usamos de la siguiente forma:

package com.bolivia.restfulbasic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.EditText;

public class MyRestFul extends AsyncTask<Void,Void,String>{

 //ruta del servidor
 private final String HTTP_RESTFUL="http://TU_SERVIDOR/restful/datos.php";
 //
 private ProgressDialog progressDialog;
 private Context context; 
 private EditText editText;

 /**Constructor de clase */
 public MyRestFul(EditText editText, Context context) {
        this.context = context;
        this.editText = editText;
    }

 /**
 * Metodo que se conecta al RESTFUL para obtener un resultado
 * */
 public String getRestFul()
 {
  HttpClient httpclient = new DefaultHttpClient();
  HttpPost httppost = new HttpPost(HTTP_RESTFUL);  
  String strResultado="NaN";
  try {   
   //ejecuta
   HttpResponse response = httpclient.execute(httppost); 
   //Obtiene la respuesta del servidor
   String jsonResult = inputStreamToString(response.getEntity().getContent()).toString();
   JSONObject object = new JSONObject(jsonResult);
   //obtiene el status
   String status = object.getString("status");
   //200 -> todo esta bien
   if( status.equals("200") )
   {  
    strResultado="";
    //extrae los registros
    JSONArray array = new JSONArray(object.getString("Registros"));
    for (int i = 0; i < array.length(); i++) 
    {
     //recorre cada registro y concatena el resultado
        JSONObject row = array.getJSONObject(i);
        String nombre = row.getString("nombre");
        String apellido = row.getString("apellido");
        strResultado += nombre + " " + apellido + "\n";
    } 
    return strResultado;
   }   
  } catch (ClientProtocolException e) {
   strResultado = e.getMessage();   
   e.printStackTrace();   
  } catch (IOException e) {
   strResultado = e.getMessage();
   e.printStackTrace();   
  } catch (JSONException e) {
   strResultado = e.getMessage();
   e.printStackTrace();   
  }
  return strResultado;
 }

 /**
 * Transforma el InputStream en un String
 * @return StringBuilder
 * */
 private StringBuilder inputStreamToString(InputStream is)
 {  
  String line = "";
  StringBuilder stringBuilder = new StringBuilder();
  BufferedReader rd = new BufferedReader( new InputStreamReader(is) );  
  try
  {
   while( (line = rd.readLine()) != null )
   {
    stringBuilder.append(line);
   }
  }
  catch( IOException e)
  {
   e.printStackTrace(); 
  }

  return stringBuilder;
 }

 /**
 * Realiza la tarea en segundo plano
 * */
 @Override
 protected String doInBackground(Void... arg0) {
  String resul = getRestFul();
  progressDialog.dismiss();  
  return resul;
 }

 /**
 * Antes de comenzar la tarea muestra el progressDialog
 * */
  @Override
  protected void onPreExecute() {
       super.onPreExecute();         
       progressDialog = ProgressDialog.show(
           context, "Por favor espere", "Procesando...");
  }

  /**
 * Cuando se termina de ejecutar doInBackground se actualiza la interfaz
 * **/
  @Override
  protected void onPostExecute(String resul) {        
      editText.setText(resul);
  }

}//end:class

Esta clase nos permite ejecutar en paralelo una tarea que no sabemos cuanto puede durar, implementamos también un ProgressDialog que se mostrara en pantalla mientras dure la conexión al servidor, cuando la conexión termine y nos devuelva un resultado, mostraremos este en pantalla.

6. MainActivity

Para terminar abre el MainActivity y completa con lo siguiente:

public class MainActivity extends Activity {

 Button button;
 EditText txt;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  button = (Button) findViewById( R.id.btnRF );
  txt = (EditText) findViewById( R.id.txtRespuesta );

  button.setOnClickListener( new View.OnClickListener() {
      @Override
      public void onClick(View view) {
       new MyRestFul(txt, MainActivity.this).execute();
      }      
  });
 }

Ejecuta y….

android restful

enjoy!!! 🙂

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Personalizar JTable: Tabla con footer

Personalizar JTable: Tabla con footer

En muchas ocasiones es necesaria la personalización de componentes java para que estos se adecuen a nuestros requerimien...

Terminator: Terminal multiventanas para Linux

Terminator: Terminal multiventanas para Linux

Cada versión de Linux viene con su propia terminal predeterminada para interactuar con el Sistema Operativo a través de...

Ejemplo de operaciones CRUD con MyBatis 3

Ejemplo de operaciones CRUD con MyBatis 3

«MyBatis es una herramienta de persistencia Java que se encarga de mapear sentencias SQL y procedimientos almacenados co...

GSON: Convertir array JSON en List de objetos Java

GSON: Convertir array JSON en List de objetos Java

En este ejemplo tenemos un array en JSON el cual representa una lista de alumnos y queremos llevar este a una lista en j...

GSON: Generar objetos java desde JSON

GSON: Generar objetos java desde JSON

En un post anterior vimos como utilizar GSON para serializar un objeto java en JSON, en esta oportunidad se vera el proc...

Tomar fotos con la camara y guardar en la sdcard

Tomar fotos con la camara y guardar en la sdcard

En este post realizaremos una aplicación android que hará uso de la cámara del celular para tomar una foto y guardarla e...

Comparte lo que sabes

Categorias

Últimas entradas

El gigante tecnologico Google a puesto un bonito Doodle en su buscador que esta fascinando a sus millones de usuarios qu...

WhatsApp anuncio a través de su blog que ya se encuentra disponible la función de envío de fotos y videos TEMPORALES, es...

Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...

TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de...

Herramientas

Generador de Enlaces a Whatsapp