jueves, 3 de mayo de 2012

Autenticación de usuario mediante la API de Elgg usando Web Services POST

Me alegra un montón escribir este post ya que he conseguido solucionar un problema con el que llevaba algunos días liado. 
Hace unos días os contaba como instalar Ellg (podéis verlo aquí). Una vez que lo tenemos instalado y funcionando, lo que estoy haciendo es una aplicación en Android para interactuar con él. Para ello tenemos que usar la API de Elgg cuya documentación no me convence mucho ... por decirlo de alguna manera.


Lo primero que tenemos que hacer para conseguir hacer llamadas a la API es ver que servicios tenemos publicados. Para ello tenemos la llamada http://miip/elgg/services/api/rest/xml/?method=system.api.list que nos devuelve algo como os muestro a continuación:

Como vemos, tenemos expuesto un método llamado auth.gettoken que nos sirve para obtener un token de autenticación. Con ese token haremos las llamadas a los métodos de la API que necesitan autenticación de usuario.

Con lo que nos muestra en la pantalla la llamada al system.api.list podemos ver que tenemos que mandarle dos parámetros, username y password, que la llamada tiene que ser mediante POST y que no requiere ni autenticación de usuario ni de API.
Para poder hacer la llamada a este método tenéis que emplear el código que os paso a continuación. Funciona para Android y está completamente hecho en Java, por lo que podría funcionar en Java directamente:

try{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://miip/elgg/services/api/rest/xml/?method=auth.gettoken");

           
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("username", "miusuario"));
    nameValuePairs.add(new BasicNameValuePair("password", "mipassword"));
 

    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
     
    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);
                
    String str = inputStreamToString(response.getEntity().getContent()).toString();   
               
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace()

 }
       

Lo más importante y lo que me hizo estar varios días dando vueltas es como se le añaden los parámetros al HttpPost. Estas tres líneas que os dejo a continuación son las que definen como se pasan los parámetros al Servicio Web y es muy importante que no se le cambien el nombre del parámetro "username" ni "password".

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("username", "miusuario"));
    nameValuePairs.add(new BasicNameValuePair("password", "mipassword"));


Espero que le sirva a alguien y no le haga perder el tiempo que me lo hizo a mi. Vuestros comentarios sobre si os funciona o no siempre serán agradecidos!

LIBRO RECOMENDADO PARA APRENDER ANDROID

Uno de los libros fundamientales y que recomiendo para aprender Android y llegar a hacer aplicaciones profesionales es: Android 2 Application Developement de Reto Meier




5 comentarios :

  1. Hola!
    Necesito una aplicación en Android que se conecte a Elgg y suba una fotografía. Estás interesado? Mandame un email a correo.ignorado@gmail.com y discutimos los detalles.

    ResponderEliminar
  2. Muchas gracias por el interés. Tienes el email enviado!

    ResponderEliminar
  3. Muchas gracias en verdad, me servirá bastante.

    ResponderEliminar
  4. Me alegro que te sirva. Si necesitas algo pregúntalo.
    Saludos

    ResponderEliminar
  5. Hola José!
    Tengo una duda,
    Se puede ejecutar el código que diste en el tutorial para editarlo y subirlo a un servidor con alguna extensión (como .php o así) para después ejecutarlo en el navegador y que este procese la acción?

    SALUDOS DESDE MÉXICO!.

    ResponderEliminar