Acceso a Web Service REST en Android

| 2014-06-23 | No hay comentarios »

Antes de comenzar el tutorial, recomiendo que ingresen a éste artículo Web Service Rest (RESTEasy) con Java EE, donde se explica paso a paso como crear un web service rest con tecnología JAVA.

Y tal como hicimos en el caso de SOAP (clic para ver el artículo), vamos a crear una aplicación de ejemplo que llame al web service rest para que realice la suma de dos números y nos devuelva el resultado.

restui

A diferencia del caso de SOAP, en esta ocasión no vamos a utilizar ninguna librería externa para acceder al servicio web, ya que Android incluye todo lo necesario para realizar la conexión y llamada a los métodos del servicio, y tratamiento de resultados en formato JSON.

Como ya hemos comentado, al trabajar con servicios web de tipo REST, las llamadas al servicio no se harán a través de una única URL, sino que se determinará la acción a realizar según la URL accedida y la acción HTTP utilizada para realizar la petición (GET, POST, PUT o DELETE).

En el artículo de la creación del web service creamos tres métodos: sumarNumerosGet, sumarNumerosPut, sumarNumerosPost , para éste ejemplo Android utilizaremos solamente la opción POST, pero igual voy a dejarles la base teórica de las demás peticiones (GET, PUT y DELETE).

Sumar – Ejemplo HttpPost

La URL a utilizar es (ustedes deben de cambiar por su ip y puerto):

http://192.168.0.4:8084/ServicioWebRest/rest/suma/sumar

Pero en este caso, el objeto JSON a enviar como entrada deberá contener los dos números a sumar:

{ nro1:5, nro2:3 } 

Para actualizar el cliente procederemos a utilizar la acción HTTP POST (objeto HttpPost).

Como expliqué en el artículo de como acceder a un web service soap, tareas largas solamente se pueden ejecutar en el hilo principal en versiones de Android anteriores a Android 3.0, es por eso que ya les dejo el ejemplo utilizando AsyncTask, que lo que hace es crear una tarea asíncrona que se ejecuta en segundo plano utilizando un hilo secundario.


private class TareaSumar extends AsyncTask<Void, Void, Boolean> {
 @Override
 protected Boolean doInBackground(Void... params) {
 // TODO: attempt authentication against a network service.
 HttpClient httpClient = new DefaultHttpClient();

 HttpPost post = new HttpPost("http://192.168.0.4:8084/ServicioWebRest/rest/suma/sumar");

 post.setHeader("content-type", "application/json");

 try
 {
 //Construimos el objeto cliente en formato JSON
 JSONObject dato = new JSONObject();

 dato.put("nro1", nro1.getText().toString());
 dato.put("nro2", nro2.getText().toString());

 StringEntity entity = new StringEntity(dato.toString());
 post.setEntity(entity);

 HttpResponse resp = httpClient.execute(post);
 resultado = EntityUtils.toString(resp.getEntity());

 }
 catch(Exception ex)
 {
 Log.e("ServicioRest","Error!", ex);
 return false;
 }

 return true;
 }

@Override
 protected void onPostExecute(final Boolean success) {
 if(success==false){
 Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
 }
 else{
 Toast.makeText(getApplicationContext(), "El resultado es: "+resultado, Toast.LENGTH_LONG).show();
 }
 }

@Override
 protected void onCancelled() {
 Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
 }
}

Como podemos ver, prácticamente todo el código se ha trasladado al método doInBackground()de la tarea, salvo la parte en la que debemos actualizar la interfaz de usuario tras la llamada que debe ir al método onPostExecute().

Por su parte, una vez creada la tarea asíncrona, en el evento click del botón nos limitaremos a instanciar la tarea y ejecutarla llamando a su método execute().


private EditText nro1,nro2;
private Button sumar;
private String resultado="";
private TareaSumar tareaSumar = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nro1=(EditText) findViewById(R.id.nro1);
nro2=(EditText) findViewById(R.id.nro2);
sumar=(Button) findViewById(R.id.suma);

sumar.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
tareaSumar = new TareaSumar();
tareaSumar.execute();
}
});

Y listo, con esto ya tenemos preparada la llamada a nuestro servicio web y el tratamiento de la respuesta recibida.

Un detalle más antes de poder probar todo el sistema. Debemos acordarnos de conceder permiso de acceso a internet a nuestra aplicación, añadiendo la linea correspondiente al Android Manifest:

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

En la imagen vemos el resultado de la suma:

Screenshot_2014-06-23-11-53-05

Para finalizar el artículo les quiero dejar la base teórica para que puedan utilizar las demás peticiones:

  • HTTP GET: En este caso se utiliza un tipo de petición http GET (objeto HttpGet) y la forma de realizar la llamada será análoga al que ya vimos en el ejemplo. 

Ejemplo:


HttpClient httpClient = new DefaultHttpClient();

HttpGet del =
 new HttpGet("http://192.168.0.4:8084/ServicioWebRest/rest/suma/sumar/8/5");

del.setHeader("content-type", "application/json");

try
{
 HttpResponse resp = httpClient.execute(del);
 String respStr = EntityUtils.toString(resp.getEntity());
}
catch(Exception ex)
{
 Log.e("ServicioRest","Error!", ex);
}

  • HTTP PUT: En este caso se utiliza un tipo de petición PUT (objeto HttpPut) y la forma de realizar la llamada será análoga al que ya vimos en el ejemplo. 

Ejemplo:


 HttpClient httpClient = new DefaultHttpClient();

 HttpPut post = new HttpPut("http://192.168.0.4:8084/ServicioWebRest/rest/suma/sumar");

 post.setHeader("content-type", "application/json");

 try
 {
 //Construimos el objeto cliente en formato JSON
 JSONObject dato = new JSONObject();

 dato.put("nro1", nro1.getText().toString());
 dato.put("nro2", nro2.getText().toString());

 StringEntity entity = new StringEntity(dato.toString());
 post.setEntity(entity);

 HttpResponse resp = httpClient.execute(post);
 resultado = EntityUtils.toString(resp.getEntity());

 }
 catch(Exception ex)
 {
 Log.e("ServicioRest","Error!", ex);
 }

  • HTTP DELETE: En este caso se utiliza un tipo de petición DELETE (objeto HttpDelete). 

Ejemplo:


HttpClient httpClient = new DefaultHttpClient();
 
String id = txtId.getText().toString();
 
HttpDelete del =
 new HttpDelete("URL");
 
del.setHeader("content-type", "application/json");
 
try
{
 HttpResponse resp = httpClient.execute(del);
 String respStr = EntityUtils.toString(resp.getEntity());
}
catch(Exception ex)
{
 Log.e("ServicioRest","Error!", ex);
}

PD: Si recibimos un string con formato json como respuesta, debemos de decodificarlo de la siguiente manera: JSONObject respJSON = new JSONObject(string);
Espero que les sea de utilidad el artículo. Saludos.

Descargar proyecto completo:

github-logo

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Crear múltiples productFlavors con Android Studio
  • Gson: Librería para parsear JSON en Android
  • Butter Knife: librería para inyectar vistas en Android
  • HTTPS y SSL en Android



SEGUÍNOS EN FACEBOOK


GITHUB