miércoles, 27 de octubre de 2010

Lo que he aprendido hoy (20101027)

Buenas amiguitos,

Hace muuucho, pero que muucho que no escribo en el blog. Pero hoy he llegado a la conclusión de que puedo usarlo para ir apuntando cosas útiles y no olvidarlas... uso raro y quizá inapropiado, pero veremos qué tal se da.

Hoy he estado bastante tiempo liado mirando cómo incrustar mis publicaciones en la página de la universidad desde Mendeley. ¿Para qué? os preguntaréis... pues para no tener que estar actualizando publicaciones en: la web de la universidad, Mendeley, la página del grupo, etc etc etc. Sí... además de tardío soy vago :)

En primer lugar he tratado de buscar alguna forma fácil de embeberlas, estilo "embed this code in your site", pero de ese estilo sólo he encontrado añadir el logo que veis en el primer "widget" a la derecha del blog con un link a mi perfil. Después he averiguado que hasta hace poco podían embeberse los artículos de colecciones públicas... pero han capado la opción desde la actualización de colecciones a grupos públicos. De todas formas, me he creado una nueva colección pública con mis publicaciones (a esto se le llama cacofonía xD) y copiando la forma en que lo han hecho en otro blog, he conseguido que se embeban en un iframe a través de una URL como ésta: http://www.mendeley.com/groups/617591/publications/embed/4486C7/ , con el id del grupo y otro id del estilo (si se borra el último id de la URL cambia el estilo, por eso lo sé). Así que quedaría algo de este estilo:



Pero de esta forma podemos adecuarlo al formato que queramos (la web de la universidad tiene unos estilos definidos) y además perdemos flexibilidad (ej., ordenar por año de publicación). Así que me he decidido a echar un ojo al API REST de Mendeley, a ver cómo se podía implementar. Para testear el API he estado usando Poster, muy útil para interfaces REST, pero no conseguía de ninguna forma que me devolviese datos en los métodos donde no es necesaria autenticación. Peeeero, me he dado cuenta de que es necesario registrar una aplicación en dev.mendeley para obtener un consumer_key que pasar como parámetro para que no esté todo el rato devolviendo errores 401. Siguiente paso conseguido!

Ahora que podía acceder a las publicaciones de mi nuevo grupo público, tocaba meterlo en una web para probar... peeeero me he topado de frente con un viejo conocido al tratar de implementar todo en Javascript: los problemas de cross-domain, es decir, que no podemos hacer con un objeto XMLHttpRequest peticiones a servidores distintos del que esta alojada la página. ¿Tendría que seguir usando truculentos IFrames ocultos para hacer las peticiones y pasar los datos a la página principal no-recuerdo-de-qué-forma? Y así he encontrado la referencia a un tipo de implementación que no había escuchado antes JSONP. Como se puede leer en la página de Wikipedia, es hacer llamadas REST a un servidor que responde con JSON, pero indicándole qué método debe llamar en el callback. Por tanto, cargando la llamada como una librería javascript se ejecutaría la función de callback que quisiéramos. Pero claro, para esto tendríamos que tener acceso al servidor para implementar esta funcionalidad... Mi gozo en un pozo!

Así que seguí buceando Google y descubrí que algunos servicios que ofrecían API lo implementaban, como GMaps (al menos en la v2), ¿por qué mendeley iba a no hacerlo? Intenté hacer la llamada a ciegas usando el parámetro "callback" y no funcionó, y demás leí en el grupo de google para desarrolladores del API y decían la funcionalidad había existido pero que la habían capado al terminar la beta (oooooh!) pero prometían activarla pronto. Así que por casualidad me puse a probar la llamada con el nombre de parámetro del artículo de la wikipedia (jsonp) y... tachán! el poster me ha devuelto lo que yo quería. No quepo en mí de gozo :)

El ejemplo de llamada es la siguiente:
http://www.mendeley.com/oapi/documents/groups/617591/docs/?details=true&consumer_key=KEYc&jsonp=createPubs

Pues ale, ya tengo tarea para mañana: realizar la implementación con JSONP e incrustarlo en mi página web. Veremos si encuentro tiempo...

Hasta mañana leyentes!

PD: Sé que la implementación la pude hacer desde un principio usando un proxy para acceder a los servicios del API, pero no tenía ganas de ponerme a PHPear... y que lo de los proxies no me mola! Ójala quiten de una vez la restricción de X-domain de XMLHttpRequest porque para mí es una tontería (quien quiere se la salta).