Crear un webservice REST para Android con PHP – Parte 2

android-logoDespués de ver en la parte 1 de este tutorial como crear la parte del webservice (PHP y MySQL), es hora de ver como crear el cliente, osea, la app de Android. En este caso, solamente nos va a hacer falta la conexión a Internet o LAN para hacer las llamadas al servidor y un parser, para leer la información XML que nos devuelve. Vamos a ello…

Al final del articulo, hay un enlace para descargar la aplicación entera, ya que hay partes muy básicas (botones y cajas de texto), o alguna parte repetitiva,  de las que no voy a poner el código.

El interface es sencillo; son 4 cajas de texto: id, nombre, email, partidas (que son los campos de la base de datos), 4 botones (Crear usuario, Listar usuarios, Ver un usuario y Modificar un usuario) y debajo hay un listview para los resultados. Quedaría así:

Android Interface

Ahora vamos con el código. Primero declaramos las variables de los Button, EditText, ListView y también un HttpClient y un HttpResponse. Declaramos ademas las 4 constantes para las llamadas a los webservices:


private static final String URL_USERS = "http://10.0.2.2/apiprueba/users.php";
private static final String URL_USER = "http://10.0.2.2/apiprueba/searchuser.php?id=%1$s";
private static final String URL_INSERT = "http://10.0.2.2/apiprueba/insertuser.php?nombre=%1$s&email=%2$s&partidas=%3$s";
private static final String URL_EDIT = "http://10.0.2.2/apiprueba/updateuser.php?id=%1$s&partidas=%2$s";

Si usamos el emulador, la ip tiene que ser la 10.0.2.2. Si utilizamos el móvil, habrá que poner la ip de la red local (192.169….) aunque a veces no funciona. Tampoco nos va a funcionar si ponemos localhost o 127.0.0.1.

Ahora vamos a ver los métodos. Primero los dos mas sencillos, que son para mostrar un AlertDialog con el resultado de la operación y otro para mostrar los usuarios o el usuario en el ArrayList.


private void showList(List usuarios) {

 ArrayAdapter adaptador = new ArrayAdapter(this,
 android.R.layout.simple_list_item_1,
 usuarios);

 listView.setAdapter(adaptador);

}

public void showResult(String msg){

 AlertDialog alertDialog = new AlertDialog.Builder(this).create();
 alertDialog.setTitle("Resultado");
 alertDialog.setMessage("Resultado de la Operacion: " + msg);
 alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int which) {

  }
 });
 alertDialog.setIcon(R.drawable.ic_launcher);
 alertDialog.show();
}

El siguiente método es el mas importante, el que parsea el XML. Para esto utilizamos un objeto XmlPullParser. Este recibe un String con el xml completo y va leyéndolo. Si encontramos una respuesta con un mensaje de confirmación o de error, sacamos el texto plano y llamamos al método ShowResult para que muestre el Alert. En el caso de que la respuesta sea un listado de usuarios (Para el botón listar o ver), vamos guardando la información del usuario en un String, lo añadimos al ArrayList usuarios y se lo pasamos al método showList. Veamos el código:


public void parse(String result){

 XmlPullParser parser = Xml.newPullParser();
 List<String> usuarios = new ArrayList<String>();
 try {
 parser.setInput(new StringReader(result));

 int evento = parser.getEventType();
 String apoyo = "";

 while (evento != XmlPullParser.END_DOCUMENT) {

 String etiqueta = null;

 switch (evento) {
 case XmlPullParser.START_DOCUMENT:
 System.out.println("Start xml");

 break;

case XmlPullParser.START_TAG:
 System.out.println("Start tag");
 etiqueta = parser.getName();

 if (etiqueta.equals("error")) {
 showResult(parser.nextText());
 }
 if (etiqueta.equals("result")) {
 showResult(parser.nextText());
 }
 if (etiqueta.equals("user")) {

 }
 if (etiqueta.equals("id")) {
 apoyo = parser.nextText() + " || ";
 }
 if (etiqueta.equals("nombre")) {
 apoyo += parser.nextText() + " || ";
 }
 if (etiqueta.equals("email")) {
 apoyo += parser.nextText() + " || ";
 }
 if (etiqueta.equals("partidas")) {
 apoyo += parser.nextText();
 }

 break;

 case XmlPullParser.END_TAG:
 System.out.println("End tag");
 etiqueta = parser.getName();
 if (etiqueta.equals("user")) {
 usuarios.add(apoyo);
 System.out.println("A�adido usuario: " + apoyo);
 }

 if (etiqueta.equals("root")) {
 if (usuarios.size()!=0){
 showList(usuarios);
 }
 }
 break;

 default:
 break;
 }
 evento = parser.next();
 }

 } catch (XmlPullParserException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }

 }

Ahora ya solo queda manejar los 4 botones. El código es similar en los 4. Hacemos la llamada utilizando las constantes que habíamos definido al principio, y con el resultado los mandamos al método parse(). Veamos por ejemplo el botón Crear Usuario

btnCrear.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				HttpPost httpPost = new HttpPost(String.format(URL_INSERT,
						txtNombre.getText().toString(),
						txtEmail.getText().toString(),
						txtPartidas.getText().toString()));
				try {
					httpResponse = httpClient.execute(httpPost);
					resp = EntityUtils.toString(httpResponse.getEntity());
				} catch (ClientProtocolException e) {

					e.printStackTrace();
				} catch (IOException e) {

					e.printStackTrace();
				}
				System.out.println(resp);
				parse(resp);

			}
		});

Con esto ya tenemos la aplicación completa. A la hora de probarla, hay que tener en cuenta:

  • Botón Crear: necesita nombre, email y partidas.
  • Botón Listar: no necesita nada, muestra los usuarios.
  • Botón Ver: necesita el id del usuario que queremos ver.
  • Botón Editar: necesita un id y el numero de partidas, que es lo que se va a modificar.

La aplicación entera la podéis descargar desde https://copy.com/2xFJf9aEFd6I.

¿Te ha gustado este artículo? ¿te ha servido de ayuda? No dudes en comentarlo o compartirlo!

Un saludo, Fran Aramayo

Deja una respuesta