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<Object, 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 } }
No hay comentarios:
Publicar un comentario