Android code snippets: Peticiones HTTP


Muchas aplicaciones Android requieren de comunicación con un servidor. El manejo de las peticiones y respuestas HTTP (request/response) se consigue fácilmente con la librería Apache Http Client (http://hc.apache.org).

En este tutorial incluimos dos ejemplos sencillos de peticiones básicas, GET y POST.


HTTP GET

Realiza una petición de algún contenido a una URL, como una fotografía.  En la respuesta recibida se puede verificar si la operación ha sido exitosa o no.

El siguiente extracto realiza la descarga de una imagen y la guarda en un fichero.

   
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public int download()
{
 int status = 0;
 try
 {
  // Parámetros
  DefaultHttpClient httpClient = new DefaultHttpClient();
  // una foto cualquiera
  String url = "http://sites.google.com/site/webitiox/_/rsrc/1356111426042/config/customLogo.gif";
  HttpGet httpRequest = null;
  try
  {
   // petición
   httpRequest = new HttpGet(new URL(url).toURI());
  } catch (URISyntaxException e)
  {
   e.printStackTrace();
  }
  // respuesta del server
  HttpResponse response = httpClient.execute(httpRequest);
  
  // Codigo respuesta
  status = response.getStatusLine().getStatusCode();
  if (status != HttpStatus.SC_OK)
  {
   status = -1;
   return status;
  }

  // obtener datos
  byte[] bytes = EntityUtils.toByteArray(response.getEntity());
  
  // copiarlos a un fichero, por ejemplo
  FileOutputStream output = new FileOutputStream("miFoto.jpg");
  output.write(bytes);
  output.close();
  
 } catch (IOException e)
 {
  e.printStackTrace();
  status = -1;
 }
 return status;
}

HTTP POST

La petición POST es un poco más compleja. Normalmente será una llamada a un script del servidor, que requerirá una serie de parámetros para poder realizar la petición. A su vez, el servidor puede devolver también datos o simplemente la respuesta con el resultado de la operación.

El siguiente extracto realiza el alta de un nuevo usuario, por lo que requiere que se le envíe el mail del usuario y la contraseña.

   
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

public int registerUser(String mail, String pass)
{
 int status = 0;

 try
 {
  // Parámetros
  DefaultHttpClient httpClient = new DefaultHttpClient();
  
  // URL del script
  String url = "http://direccion/scripts/register.php";

  // Post request
  HttpPost httpPost = new HttpPost(url);
  
  // Parámetros
  List<namevaluepair> nameValuePairs = new ArrayList<namevaluepair>(2);
  nameValuePairs.add(new BasicNameValuePair("user", mail));
  nameValuePairs.add(new BasicNameValuePair("pass", pass));
  UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs);
  httpPost.setEntity(entity);
  
  // respuesta del server
  HttpResponse response = httpClient.execute(httpPost);
  
  // Codigo respuesta
  status = response.getStatusLine().getStatusCode();
  if (status != HttpStatus.SC_OK)
  {
   status = -1;
  }

 } catch (IOException e)
 {
  e.printStackTrace();
  status = -1;
 }
 return status;
}

IMPORTANTE

Las peticiones a servidor NO se realizan de forma asíncrona, por lo que se corre el peligro de bloquear  el hilo principal (UI thread) de la aplicación y es cuando aparece el mensajito  "La aplicación no responde". Para evitarlo, una solución es encapsular las peticiones en un AsyncTask de la siguiente forma:


      
class DoRequest extends AsyncTask&ltObject, Void, Void>
{

    @Override
    protected String doInBackground(Object... arg0) 
    {
    // Aquí las peticiones al servidor
    }

    @Override
    protected void onPostExecute(Void result) 
    {
        super.onPostExecute(result);
        // Aquí operar con el resultado
    }
}