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