- Utilizando el servicio web PHP desde Asteroides

En este apartado vamos a realizar un cliente del servicio web diseñado en el apartado anterior para usarlo desde Asteroides.

Ejercicio: Uso del servicio web PHP en Asteroides

En este ejercicio comenzamos creando una base de datos y luego escribiremos un par de ficheros PHP que implementarán las dos acciones del servicio web puntuaciones.

1.    Abre el proyecto Asteroides.

2.    Vamos a hacer el acceso a la red desde el hilo principal. Para evitar que StrictMode nos lo impida, añade el siguiente código en el método onCreatede MainActivity.java:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().
                                           permitNetwork().build());

3.    Para poder acceder a StrictMode tenemos un nivel de API mínimo de 9. Abre AndroidManifest.xml y asegúrate de que el valor de minSdkVersion sea igual o mayor que 9:

<uses-sdk android:minSdkVersion="9"

4.    Como en todos los ejemplos de este tema, asegúrate de que la aplicación solicita el permiso de acceso a Internet. Añade la siguiente línea en AndroidManifest.xml:

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

5.    Pasemos a implementar la interfaz AlmacenPuntuacionesaccediendo al servidor de servicios web que acabamos de desarrollar. Para ello crea una nueva clase en la aplicación Asteroides y copia el siguiente código:

public class AlmacenPuntuacionesSW_PHP implements AlmacenPuntuaciones {

   public Vector<String> listaPuntuaciones(int cantidad) {
      Vector<String> result = new Vector<String>();
      try {
         URL url=new URL("http://158.42.146.127/puntuaciones/lista.php"
                                                             + "?max=20");
         HttpURLConnection conexion = (HttpURLConnection) url
                                                        .openConnection();
         if (conexion.getResponseCode() == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new
               InputStreamReader(conexion.getInputStream()));
            String linea = reader.readLine();
            while (!linea.equals("")) {
               result.add(linea);
               linea = reader.readLine();
            }
            reader.close();
         } else {
            Log.e("Asteroides", conexion.getResponseMessage());
         }
      } catch (Exception e) {
         Log.e("Asteroides", e.getMessage(), e);
      } finally {
         if (conexion!=null) conexion.disconnect();
         return result;
      }
   }

El primer método se encarga de invocar la operación lista.php del servicio web que acabamos de implementar. Comienza definiendo la URL correspondiente al servicio web. En el código hay que reemplazar 158.42.146.127 por la dirección IP de tu ordenador. Recuerda que este programa lo ejecutarás desde el emulador o desde un teléfono real, y en ambos casos la IP será diferente de la de tu ordenador. Esto imposibilita utilizar como dirección localhost, como sí hicimos con otros clientes que ejecutábamos desde el mismo ordenador.

Una vez creada la URL se establece la conexión y mediante el método GET se manda el parámetro correspondiente.

6.    Pasemos a ver el segundo método de la clase. A continuación copia el siguiente código:

public void guardarPuntuacion(int puntos, String nombre, long fecha) {
      try {
         URL url=new URL("http://158.42.146.127/puntuaciones/nueva.php?"
               + "puntos="+ puntos
               + "&nombre="+ URLEncoder.encode(nombre, "UTF-8")
               + "&fecha=" + fecha);
         HttpURLConnection conexion = (HttpURLConnection) url
                                                .openConnection();
         if (conexion.getResponseCode() == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new
                  InputStreamReader(conexion.getInputStream()));
            String linea = reader.readLine();
            if (!linea.equals("OK")) {
               Log.e("Asteroides","Error en servicio Web nueva");
            }
         } else {
            Log.e("Asteroides", conexion.getResponseMessage());
         }
      } catch (Exception e) {
         Log.e("Asteroides", e.getMessage(), e);
      } finally {
         if (conexion!=null) conexion.disconnect();
      }
   }
}

La estructura de este método es similar al anterior, pero ahora llamamos a la operación nueva.php. Recuerda que en caso de una llamada satisfactoria, la respuesta ha de ser OK. Consideraremos que ha habido un error si esta no es la respuesta.

7.    Puedes reemplazar 158.42.146.127 por la dirección IP de tu ordenador.

8.    Modifica el código correspondiente para que la nueva clase pueda ser seleccionada como almacén de las puntuaciones.

9.    Verifica el funcionamiento.