miércoles, 1 de julio de 2009

Servicio web Webooks


Si bien el lenguaje de scripting PHP (PHP Hypertext Processor) no era el fin de investigación de este proyecto, se ha desarrollado un servicio web en dicho lenguaje. Cuyo objetivo no es otro que comunicarse con diferentes servicios web por internet para realizar búsquedas de libros. Este servicio se desarrollo con diferentes objetivos, uno de los cuales (y más importantes) fue desacoplar la aplicación JavaFX, para que esta solo se encargase de presentar los resultados de las búsquedas de libros on-line.

IDEAS QUE MOTIVARON AL DESARROLLO DEL SERVICIO WEB EN PHP
  • Desacoplar la aplicación JavaFX para que solo sea responsable de presentar los datos al usuario (fin porque fue desarrollado la plataforma JavaFX). De este modo se pudo dedicar más tiempo en tratar de mejorar la experiencia del usuario en la aplicación.
  • JavaFX es una tecnología realmente nueva, la cual se encuentra actualmente bajo desarrollo. Lo que implica muchas modificaciones en las API’s base de la plataforma (la última versión liberada por SUN es la 1.2 en Mayo de 2009). Por este motivo no se decidió realizar las peticiones hacia los sitios de búsqueda de los datos desde la aplicación JavaFX.
  • Evitar las diferentes limitaciones de cada implementación de la tecnología FX. Es decir, evitar las incompatibilidades entre las versiones desktop, web y mobile.
  • Debido a que el lenguaje PHP está bien asentado, se conocía bien la plataforma para poder crear un servicio estable y con buena performance en poco tiempo.
  • Debido a la flexibilidad del lenguaje PHP, la existencia de módulos útiles para el manejo del formato xml.
  • Permitir que el servicio webooks pueda ser utilizado por otras aplicaciones (como podría ser una implementación web de webooks desde que cualquier lenguaje), desde otros lenguajes de programación, o incluso por terceras partes como una API funcional para la búsqueda on-line de libros.
Una de las principales ideas con las que se comenzó a desarrollar el servicio web, fue la de permitir agregar fácilmente nuevos servicios de búsqueda. Es decir, una vez que se definió el campo en el cuál se iba a realizar la implementación, se investigaron los posibles motores de búsqueda de libros que poseían API’s para acceder libremente. Como resultado se obtuvieron muchos, pero se eligieron dos de los más grandes: los servicios web de Amazon y Google books.
A partir de estos servicios web se obtienen los datos de internet. El servicio webooks permite realizar búsquedas sobre estos motores, pero no se limita a ellos. Es fácilmente expansible la lista de motores de búsqueda con los que trabaja. Esto se debe gracias a que se implemento íntegramente orientado a objetos y se aplicaron diferentes patrones de diseño para mejorar la reutilización y expansión del mismo.

ARQUITECTURA DEL SERVICIO

El siguiente diagrama muestra a grandes rasgos la arquitectura del servicio web:


El servicio esta implementado mediante el patrón MVC. Donde todas las peticiones al mismo, ingresan por un único lugar (“ControladorFrontal” en donde se gestionan cuestiones de seguridad y funcionamiento general de la aplicación) y se responden por el mismo (una instancia de la Vista con ciertos valores se devuelve al usuario).
Cuando un nuevo request llega al servicio webooks se ejecutan los siguientes pasos:
  1. Se instancia el Controlador Frontal (el cual se encargará de verificar el tipo de petición, en este caso XML) y se crea un objeto de la clase AutoLoader (el cual se encarga de realizar la carga automática de definiciones de clases por demanda).
  2. Luego se delega el control de la petición a una instancia de la clase llamada ControladoraServiciosWeb la cuál verifica los parámetros y crea los objetos necesarios para conectarse con el servicio.
  3. Los servicios son objetos que devolverán los datos (clases pertenecientes al paquete “Servicios” dentro del Modelo). Estos “Servicios” crearán objetos del modelo (ColeccionLibros o Libro) como resultados de sus peticiones a la web.
  4. Una vez finalizadas las búsquedas a través de los servicios (“Amazon”, “Google”, etc.), la ControladoraServiciosWeb instancia una Vista correspodiente para mostrar los datos, pasando como parámetros los objetos del modelo.
  5. Las vistas realizan el tratamiento de la presentación del modelo, y devuelven dicha información hacia la ControladoraServiciosWeb.
  6. Se informa al ControladorFrontal la salida de la petición y se presentan los resultados.
AGREGANDO NUEVAS FUENTES DE BÚSQUEDA PARA WEBOOKS

Desde el principio cuando se comenzó el diseño de esta aplicación, se tuvo en cuenta la posibilidad de expandir el abanico de motores de búsqueda de libros con los que se trabajaba. Es decir, implementar la aplicación php de modo que cuando se finalizara su desarrollo, sea posible agregar nuevos servicios con los cuales interactuar para obtener los resultados de las búsquedas.
Por el motivo citado en el párrafo anterior, se diseño un xml el cuál contendría los servicios con los que trabaja la aplicación:

http://www.webooks.com.ar/config.xml

Gracias a la inyección de dependencia, se pueden agregar nuevos servicios de búsquedas con solamente hacer las siguientes modificaciones:
  • Modificar el xml de configuración, agregando un nodo con sus correspondientes datos (dentro de los cuales se encuentran dos fundamentales para webooks: “class_name” y “class_definition”).
  • Agregar las clases correspondientes para el parseo de los xml de respuesta y generación del xml webooks.
El siguiente es un diagrama que muestra el árbol de dependencias de estas clases y las implmentaciones para Amazon y Google:

El método search() de la clase SearchService es un “template method”, el cual tiene definido el orden en que se realizarán las operaciones para comunicarse con un servicio de búqueda. Al tener definido este método, desde las clases hijas solo es necesario redefinir los métodos parseResponse() y prepareRequest(). Gracias al método search, se accederá al nuevo servicio y se obtendrán los resultados.


class SearchService {
//...

/*
* @return ColeccionLibros
*/
public function search() {
return $this->parseResponse($this->request($this->prepareRequest()));
}
//...
}
?>


Como se ve en el fragmento de código anterior el método search() realiza el parseo (invocando el método parseResponse() de la clase hija) del resultado de una petición (invocando el método request() de la clase padre) a la cual se pasa como parámetro ciertos valores relacionados a un servicio de búsqueda en especial (invocando al método prepareRequest() de la clase hija).

UTILIZANDO EL SERVICIO

La utilización del servicio es muy sencilla, a continuacion se muestran dos ejemplos para buscar libros en los diferentes motores:

http://www.webooks.com.ar/xml/amazon/search?query=SCJP
http://www.webooks.com.ar/xml/google/search?query=SCJP

El primer directorio virtual "XML" se refiere al formato de salida.
El segundo directorio virtual se refiere al motor de búsqueda que se va a utilizar
El tercer directorio se refiere a la acción a realizar (puede ser "search" o "detail")
Por último se encuentran los parámetros de la llamada.

En la siguiente entrada se detallara el modo de utilización del servicio.

No hay comentarios:

Publicar un comentario