lunes, 17 de marzo de 2014

Hace poco más de un mes publiqué una entrada introductoria al WSO2 API Manager, APIM, que incluía un ejemplo como usar esta herramienta, el cual pueden consultar para entender lo que haré en esta entrada.
Básicamente estaremos viendo como exponer servicios usando el APIM y como consumirlos desde una aplicación web luego de autenticarnos.

La idea siempre parte de lo que se aprecia en la siguiente imagen y lo estaremos implementando paso a paso.



Paso 1: desplegar la aplicación que contiene los servicios en el WSO2 Application Server.
Nos descargamos el fuente desde esta ubicación  y en mi caso lo guardo en una carpeta que se llama “tutorial” y tendremos la siguiente estructura de carpetas.


En este paso trabajaremos con el “pizza-shack-api” así que entramos en el directorio hasta llegar a la  ruta [tutorial]\pizza-shack-api\src\main\java\com\pizzashack\ donde se puede observar los siguientes ficheros.



El único que he cambiado es el PizzaMenu.java debido a un problema con la localización, pues  da problema con el punto y la coma en el formato de los decimales.
Tan pronto lo descargan se ve así:
 
    private PizzaMenu() {
  Random rand = new Random();
  DecimalFormat format = new DecimalFormat("#.##");
  
  MenuItem item1 = new MenuItem();
  item1.setName("Chicken Parmesan");
  item1.setDescription("Grilled chicken, fresh tomatoes, feta and mozzarella cheese");
  item1.setPrice(format.format(rand.nextInt(20) + 10 - 0.01));
  item1.setIcon("/images/1.png");
  items.add(item1);


Luego de realizar el ajuste queda así:
 
 private PizzaMenu() {
  Random rand = new Random();
        DecimalFormat format = new DecimalFormat("#.##", new DecimalFormatSymbols(Locale.ENGLISH));

  MenuItem item1 = new MenuItem();
  item1.setName("Chicken Parmesan");
  item1.setDescription("Grilled chicken, fresh tomatoes, feta and mozzarella cheese");
  item1.setPrice(format.format(rand.nextInt(20) + 10 - 0.01));
  item1.setIcon("/images/1.png");
  items.add(item1);  
  


Una vez hecho este cambio vamos a la raíz del proyecto y ejecutamos el comando Maven mvn clean package para que nos cree en la carpeta target el fichero pizzashack-api-1.0.0.war que será la aplicación web que debemos  desplegar en el WSO2 Application Server.
Iniciamos el servidor AS y bien podemos copiar  el fichero en la ubicación [AS]\repository\deployment\server\webapps\ y entrar a través de la interfaz gráfica de la herramienta e ir hasta Home> Manage > Applications > Add> JAX-WS/JAX-RS, Y agregarla por esa vía.



En ambos casos ya tendrán desplegada la aplicación que contiene el servicio, tal y como pueden ver a continuación.


Al dar clic en el contexto vemos el dashboard de la aplicación.



Aquí pueden ver las opciones para generar un cliente, copiar su endpoint o ver el diseño del mismo dando clic en WADL.
Volviendo atrás, si dan clic en “Find Services”  podrán ver el servicio que se implementa.



Y al dar clic en el enlace tenemos acceso a la descripción del servicio.
Si se fijan verán un servicio para obtener el menú a través de esta URL: http://127.0.0.1:9765/pizzashack-api-1.0.0/api/menu/  si lo probamos con un cliente veremos lo siguiente:



Nos devuelve el nombre del plato, una descripción, un icono para que sea puesto en la aplicación web que  consuma de este servicio y el precio.
Los invito llegado este punto que prueben el resto de los servicios para que vean cómo funcionan, así como revisar el fuente de cada servicio para que dominen las operaciones implementadas.

Paso 2: publicar estos servicios como APIs en el WSO2 API Manager.
El objetivo de este paso es publicar los servicios como APIs, y para ello debemos acceder al WSO2 API-M Publisher a través de esta URL: https://localhost:9443/publisher
 



Una vez autenticados debemos ir hasta   APIs / Add New API tal y como muestra la siguiente imagen.



Ahora creams las 3 APIs una por cada servicio usando la siguiente información:

Delivery API

                API Name= pizzaShack
                Context = /pizzashack/delivery
                Version = 1.0.0
                Production Endpoint URL=http://localhost:9765/pizzashack-api-1.0.0/api/delivery
                API Resources = Dejar los valores por defecto

Order API
               
                API Name= pizzashack-order
                Context = /pizzashack/order
                Version = 1.0.0
                Production Endpoint URL=http://localhost:9765/pizzashack-api-1.0.0/api/order
                API Resources = Dejar los valores por defecto

Menu API

                API Name= pizzashack-menu
                Context = /pizzashack/menu
                Version = 1.0.0
                Production Endpoint URL=http://localhost:9765/pizzashack-api-1.0.0/api/menu
                API Resources = Dejar los valores por defecto

Una vez terminada esta acción tendremos todas las APIs ya creadas y visibles a través del Browser.



CREATED significa que están en el estado de creadas. Ahora debemos entrar a cada una y modificar el estado en la opción del ciclo de vida para ponerlas como publicadas.




Si juegan un poco con el ciclo de vida verán que se lleva un control de las acciones realizadas. Algo muy útil para saber que ha pasado con el API en todo momento.
Luego de cambiar el estado de las 3 APIs se visualizan de la siguiente manera.



Pueden observar cómo ha cambiado su estado.
Así de esta manera hemos creado las 3 APIs y las hemos publicado para que estén visibles en el próximo paso.


Paso 3: Crear una aplicación y subscribir las APIs.

Lo primero es ir al Store del WSO2 API Manager, para poder configurar adecuadamente el consumo de las APIs. Deben acceder a la siguiente URL: https://localhost:9443/store
Tan pronto nos autenticamos en el Store podemos ver las 3 APIs creadas en el paso anterior.




Ahora debemos dar clic en una de las APIs, y en el combo de las aplicaciones seleccionar la aplicación por defecto o una que ustedes creen. En este ámbito se entiende por aplicación a la agrupación lógica de un conjunto de APIs sobre la cual realizaremos determinadas acciones. En mi caso creo una nueva aplicación con el nombre de “Pizza” y accediendo a cada API selecciono en el combobox de las aplicaciones la que he creado.
Al finalizar esta acción las 3 APIs están vinculadas con mi aplicación “Pizza”. La forma de ver esto es ir a la opción “My Subscriptions” en el menú superior y verán seleccionada en un combobox la aplicación y se van al final de la página verán lo siguiente.


Al inicio de la página tenemos esta configuración:



La cual es muy importante pues nos generará las claves para consumir las APIs, así que le damos al botón “Generate” y obtenemos lo siguiente:



Este token que hemos generado es del tipo “Application Access Tokens”. La herramienta WSO2 API Manager permite generar además de este tipo de token un “User Access Tokens”.
La diferencia es que el primero nos permite identificar y autenticar una aplicación completa, mientras que el segundo es para identificar y autenticar al usuario final de una aplicación. Usamos el primer token porque nos permite con un solo token acceder a todas las APIs de la aplicación “Pizza”.
Ahora podemos probar el consumo de una API usando curl con el siguiente comando:
curl -k -H "Authorization: Bearer c4H4fMWbPGw8MNY5gVM9s_DAgXoa" https://localhost:8245/pizzashack/menu/1.0.0   resalto en negrita y subrayado el token que debe corresponderse con el valor del “Access Token” que pueden observar en la imagen arriba.
Esto  nos devuelve lo siguiente.



Con lo cual ya sabemos que nuestras APIs están online.

Paso 4: configurar y desplegar una aplicación web en java que consuma las APIs usando las claves generadas.

Llegado este momento debemos ir al código de la aplicación web que se encuentra en el directorio “pizza-shack-web” y ajustar los parámetros necesarios en el fichero web.xml que se encuentra en [pizza-shack-web]\src\main\webapp\WEB-INF\web.xml

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
 version="2.4">
 <display-name>Pizza Shack Client App</display-name>

 <listener>
  <listener-class>com.pizzashack.client.web.PizzaShackContextListener</listener-class>
 </listener>
 
 <context-param>
        <param-name>serverURL</param-name>
        <param-value>http://localhost:8280/pizzashack</param-value>
    </context-param>
    <context-param>
        <param-name>loginURL</param-name>
        <param-value>http://localhost:8280/token</param-value>
    </context-param>
    <context-param>
        <param-name>consumerKey</param-name>
        <param-value>yOJ2gUwZctQ44rZYnb2BM88bUG0a</param-value>
    </context-param>
    <context-param>
        <param-name>consumerSecret</param-name>
        <param-value>4uUpUtHc7rvNknG1QqPVHLdCneIa</param-value>
    </context-param>
 
</web-app>


Luego vamos a la raíz del directorio y ejecutamos el comando Maven mvn clean package.
Esta acción nos genera la aplicación pizzashack.war  que procedemos a desplegar también en el WSO2 Application Server.
Accedemos al WSO2 AS y vamos hasta: Home> Manage > Applications> Add> Web Applications buscamos el .war recién creado y le damos al botón “Upload”.
Como la aplicación web recientemente subida al AS tiene entre sus parámetros el consumerKey y el consumerSecret la aplicación puede generar token específicos para los usuarios y así de esta manera se restringe el acceso a las APIs.


Paso 5: acceder a la aplicación y consumir las APIs.
Ahora procedemos al siguiente enlace: http://localhost:9765/pizzashack/login.jsp y ponemos las credenciales admin/admin
El sistema nos deja entrar y podemos ver la siguiente pantalla, realmente deliciosa    :-D



Ordenamos una pizza.



Y se nos genera un número de identificación.



Con este número vamos al menú superior y seleccionamos  “My Orders”.



Introducimos el número y le damos “Find order”.




Como tenemos acceso al código fuente pues podemos ver la implementación tanto de la aplicación JAX-RS como de la aplicación web en JAVA y el consumo de las APIs, esto lo estaremos analizando en entradas siguientes. Pero igual nos sigue quedando pendiente el tema del monitoreo del consumo de las APIs lo cual realizaremos en la siguiente entrada  conectando a esta solución el WSO2 BAM.

Espero les sea de utilidad.

Algunos enlaces que le pueden servir.

0 comentarios:

Publicar un comentario