Mostrando entradas con la etiqueta REST. Mostrar todas las entradas
Mostrando entradas con la etiqueta REST. Mostrar todas las entradas

viernes, 22 de enero de 2016

WSO2 Data Service Server NPE con REST y JSON.

image

Haciendo algunas pruebas para un servicio de datos a manera de demo, estuvimos revisando sus facilidades para exponer funcionalidades de manera RESTful. Una vez configurada una operación de insersión que recibía varios datos y enviar el JSON que imaginamos debía enviarse nos topamos con un error NPE.

Probamos con POX desde el RESTClient en firefox y sin problema.

image

Pero con JSON, convirtiendo el XML a JSON usando http://codebeautify.org/xmltojson no funcionaba.
image


En la consola se muestra el siguiente error:
image


Hicimos el cambio que pedía en el JSON:
image

Y sin problema. Faltaba incluirle al inicio del elemento raiz el string   _post.

miércoles, 1 de julio de 2015

Acá les dejo el enlace a un nuevo post que acabo de publicar en mi blog que puntualmente los temas que toca son:
  • Compilar y empaquetar el redmine-connector
  • Desplegar y activar un conector en el WSO2 ESB
  • Como importar un conector para el Developer Studio
  • Como implementar un Servicio Proxy en este caso usando el redmine-connector haciendo uso del DS
  • Como construir y desplegar un Composite Application Project desde el DS en el WSO2 ESB
  • Como realizar un test de un servicio Rest en nuestro caso haciendo uso del plugins RestClient del Mozilla Firefox y desde el SoapUI
Nos les adelanto nada más solo sigan este enlace:  http://wp.me/p5DCiP-10

Saludos

lunes, 23 de febrero de 2015

WSO2 DS: Exponiendo nuestra BD Oracle usando REST.

En otras entradas hemos visto lo fácil que es crear un servicio de datos usando la suite de WSO2, bien sea a través del WSO2 AS o el WSO2 DSS. También hemos visto como exponer estos datos usando REST con solo unos pocos pasos adicionales y como consumir estos servicios expuestos usando REST.

En esta entrada veremos como combinarlo todo implementando un escenario que nos ha pedido un cliente hace poco: Exponer sus datos almacenados en una BD Oracle tanto por SOAP como por REST de una manera altamente configurable y rápida de implementar.
Veamos una pequeña PoC que le preparamos:


Paso 1: Crear la BD.

Nos conectamos al SGBD y creamos un usuario “appserver” con contraseña “appserver”.

image

Volvemos a conectar pero esta vez usando las credenciales del usuario recién creado y en la BD que usamos en una entrada anterior DBMB.

Una vez autenticados creamos una tabla “cliente” e insertamos alguna data que luego será consultada.

image


Por último creamos un procedimiento almacenado para hacer una inserción en la tabla:

image




Paso 2: Crear el servicio de datos.

Haciendo uso del conocimiento que ya tenemos de entradas anteriores, procedemos a crear un servicio de datos. En la parte de configuración del DataSource quedaría de la siguiente manera:

image

Se puede apreciar que se ha dado clic en “Test Connection” y se ha conectado exitosamente a la BD. Previamente debemos haber añadido el jar ojdbc6.jar a [HOME_AS]\repository\components\lib\

La primera query que agregamos es la de consumir el procedimiento almacenado anteriormente creado:

image


Y la segunda query es para consultar la información de la tabla:

image
image


Una vez terminada estas configuraciones en las querys procedemos a crear las operaciones que no tienen nada de complicación, guardamos nuestro servicio y procedemos a consumirlo.

image



Paso 3: Incluir funcionalidad REST.

La implementación consiste en agregar dos recursos tal y como se muestra a continuación. Uno que se llama “clientes” para obtener el listado de clientes y otro que se llama “insertarCliente” para insertar los datos de un cliente en la BD.

image

Sus configuraciones son realmente sencillas. La de clientes es:

image


Y la de insertarCiente es:

image


Paso 4: Probar por REST.

Una vez guardado el servicio se procede a probarlo usando el plugin para REST de firefox:

image

También lo podemos probar desde el SOAPUI:

image 

Y ahora veremos como llamar a la operacion de insertarCliente primero por el SOAPUI:

image

Y luego por el cliente REST de firefox:

image

Vean que se insertaron Cliente7 y Cliente8.

Para finalizar una consulta a través del recurso “clientes” nos confirma el éxito de ambas llamadas.

image 

Eso es todo, de una manera muy fácil hemos expuesto nuestros datos tanto por SOAP como por REST.

Esperamos les sea de utilidad.

jueves, 22 de mayo de 2014

Exponiendo datos de nuestra BD a través de APIs con WSO2


En esta entrada quiero mostrar cómo usando varios elementos ya tratados en el blog podemos muy fácilmente exponer nuestros datos a través de APIs y realizar operaciones CRUD sobre ellos.

En esta entrada vimos como crear un servicio de acceso a datos muy fácilmente y en tan solo 3 minutos, que incluyera las operaciones CRUD necesarias para manipular la información de una tabla.

Luego en esta otra entrada vimos como podíamos exponer dichas operaciones de una forma RESTful, lo que en este caso la información la obteníamos como un XML y no en formato JSON.

Así que en esta otra entrada entonces se mostró como podíamos indicarle a la herramienta de WSO2 AS que queríamos también mostrar la información como un JSON.

Hasta aquí tenemos un servicio de acceso a datos desplegado en el WSO2 AS que puede ser consumido por SOAP o por REST y en este último caso las respuestas las puede dar tanto en POX como en JSON, pero eso no es todo.

WSO2 está apostando fuerte por el tema de las APIs, y con su herramienta WSO2 API Manager se ha posicionado entre las mejores empresas en brindar soluciones de este tipo.

Guiándonos por esta otra entrada podemos ir directamente al paso 2 y registrar nuestro servicio en el WSO2 API Publisher para luego gestionarlo en el WSO2 API Store y generar las claves de acceso que nos permitirán probarlo, tal y como se explica en el paso 3.

Ya aquí podemos usar curl o un cliente RESTful para consumir la API siempre usando el token de autorización generado por el API Store.

Por último si deseamos monitorizar el consumo del API solo basta configurar el BAM para que se establezca una conexión entre el AM y el BAM tal y como se muestra aquí.

lunes, 5 de mayo de 2014

Ejemplos de uso de JAX-WS con CXF.

En esta entrada quiero dejarles el código de 3 proyectos que he usado como material de entrenamiento básico en un curso que impartí para el desarrollo de servicios usando CXF, como implementación para el API de JAX-WS.

Proyecto Example3_JAX-RS: Se implementa un servicio RESTful usando la implementación CXF para JAX-WS.

Proyecto Example3_JAX-WS: Se implementa la misma funcionalidad del ejemplo anterior pero se expone como un servicio web a partir de un WSDL ya diseñado, o sea usando el enfoque top-down.

Proyecto Example4_JAX-WS: Se implementa la misma funcionalidad de los ejemplos anteriores pero el servicio está asegurado con el escenario UserNameToken y HTTPS.

En estos ejemplos se usa Spring como mecanismo para mantener todo unido y Maven para la gestión de dependencias.

En el caso del último ejemplo uso las facilidades multimódulo de Maven para separar en módulos los diferentes aspectos que me interesan(servicio, webapp y cliente) En los casos en que se quiera exponer una lógica de negocio ya existente pues se puede crear un módulo para esta lógica de negocio, lo cual siempre facilita su reutilización.

Espero les sea de utilidad.

sábado, 22 de marzo de 2014

WSO2 ESB: Transformando de JSON a SOAP y de SOAP a JSON.



En esta entrada quiero mostrarles una de las maneras de implementar el siguiente escenario:

Se tiene un servicio backend implementado usando SOAP que recibe un valor de temperatura en Celsius y la devuelve en Fahrenheit, como puede ser el siguiente: http://www.w3schools.com/webservices/tempconvert.asmx?wsdl del cual nos interesa la operación CelsiusToFahrenheit.

Se desea que la petición del cliente sea un json y la respuesta igual sea un json.

La solución usando el WSO2 ESB es implementar un servicio proxy que reciba un json, lo transforme a un mensaje SOAP y lo mande al servicio backend, luego la respuesta SOAP la transforme nuevamente en un json y la mande de vuelta al cliente.

El mediador que usaremos para poder cambiar de un formato de mensaje a otro será el payloadfactory y verán lo útil que es a partir de las últimas versiones del WSO2 ESB, ya que nos permite tanto generar mensajes SOAP como JSON con bastante facilidad.

Para este servicio backend y usando el mediador PayloadFactory el servicio proxy queda como sigue:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="JsonToXMLProxy"
       transports="https http"
       startOnLoad="true"
       trace="disable">
   <description/>
   <target>
      <endpoint>
         <address uri="http://www.w3schools.com/webservices/tempconvert.asmx" format="soap11"/>
      </endpoint>
      <inSequence>
         <log>
            <property name="TEMPERATURA_ENTRADA" expression="json-eval($.celsius)"/>
         </log>
         <payloadFactory media-type="xml">
            <format>
               <web:CelsiusToFahrenheit xmlns:web="http://www.w3schools.com/webservices/">
                  <web:Celsius>$1</web:Celsius>
               </web:CelsiusToFahrenheit>
            </format>
            <args>
               <arg evaluator="json" expression="$.celsius"/>
            </args>
         </payloadFactory>
         <header name="Action"
                 value="http://www.w3schools.com/webservices/CelsiusToFahrenheit"/>
      </inSequence>
      <outSequence>
         <log>
            <property xmlns:p="http://www.w3schools.com/webservices/"
                      name="TEMPERATURA_SALIDA"
                      expression="//p:CelsiusToFahrenheitResponse/p:CelsiusToFahrenheitResult"/>
         </log>
         <payloadFactory media-type="json">
            <format>
                            "Temperatura" : {
                                "EnFahrenheit" : $1
                            }
            </format>
            <args>
               <arg xmlns:p="http://www.w3schools.com/webservices/"
                    evaluator="xml"
                    expression="//p:CelsiusToFahrenheitResponse/p:CelsiusToFahrenheitResult"/>
            </args>
         </payloadFactory>
         <property name="messageType" value="application/json" scope="axis2"/>
         <send/>
      </outSequence>
   </target>
</proxy>

Para probar el servicio usamos el siguiente comando curl:

curl -X POST -H "Content-Type: application/json" -d "{ \"celsius\": \"20\" }" "http://localhost:8280/services/JsonToXMLProxy"

Y la respuesta es la siguiente:

"Temperatura" : {
                   "EnFahrenheit" : 68
                }


Al ESB llega un mensaje como el siguiente:

POST /services/JsonToXMLProxy HTTP/1.1
User-Agent: curl/7.25.0 (i386-pc-win32) libcurl/7.25.0 OpenSSL/0.9.8u zlib/1.2.6 libssh2/1.4.0
Host: 127.0.0.1:4444
Accept: */*
Content-Type: application/json
Content-Length: 19

{ "celsius": "20" }

Este mensaje json primero es capturado por un log que imprime en consola el valor de celsius usando la siguiente expresión: json-eval($.celsius)

2014-03-21 22:44:22,976] INFO - LogMediator To: /services/JsonToXMLProxy, MessageID: urn:uuid:60f0298e-f66d-4f9c-a2a9-5480ee2569a5, Direction: request, TEMPERATURA_ENTRADA = 20

Luego usando el mediador payloadfactory se crea un mensaje de acuerdo a la estructura que espera el servicio backend. Para saber su estructura siempre me apoyo en la herramienta SOAPUI, probando primero el servicio. El valor que se le pasa en el atributo se obtiene a partir de evaluar como json la expresión $.celsius.

Algo importante a tener en cuenta es especificar el Header, lo cual se hace usando el mediador header.
Y así de esta manera se termina la secuencia de entrada.

El mensaje creado es enviado al endpoint definido y su respuesta que viene en este formato, debe ser procesada:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.w3schools.com/webservices/">
   <soapenv:Body>
      <web:CelsiusToFahrenheitResponse>
         <!--Optional:-->
         <web:CelsiusToFahrenheitResult>68</web:CelsiusToFahrenheitResult>
      </web:CelsiusToFahrenheitResponse>
   </soapenv:Body>
</soapenv:Envelope>

Cuando este mensaje llega al ESB lo primero que hacemos es obtener en un log el valor de la temperatura, y se imprime como sigue en pantalla:

[2014-03-21 22:44:23,109] INFO - LogMediator To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:c76239bb-16cf-459d-99e5-5296d5aba938, Direction: response, TEMPERATURA_SALIDA = 68

Luego para crear la respuesta que enviaremos al cliente nos apoyamos en otro mediador payloadfactory en la secuencia de salida, definiendo que el tipo será json y especificando la estructura del mensaje de salida. El valor del argumento se obtiene a partir de conocer la estructura del mensaje SOAP que llega al ESB desde el servicio backend. Importante no dejar de incluir la propiedad de nombre messageType.

Y eso es todo, hay otras maneras de implementar este escenario bien sea usando el mediador script o el XSLT, pero en este caso me gusta más usar el payloadfactory.

Espero les sea de utilidad.

miércoles, 12 de febrero de 2014

Servicios de Datos en WSO2 con respuesta del tipo JSON.

En una entrada pasada  vimos como exponer datos almacenamos en una base de datos relacionar a través de un servicio de acceso a datos usando la suite de WSO2.

Luego vimos como exponer este mismo servicio pero de una manera RESTful, lo que en ese momento solo se exponía  el XML de la respuesta.

Para terminar se hizo otra entrada donde se mostraba como crear un servicio usando jersey para consumir el servicio de acceso a datos expuesto de una manera RESTful.

La razón de esta entrada entonces es mostrar como los datos expuestos por este servicio se pueden exponer en JSON y no en XML.

Los pasos son los siguientes:

En el fichero axis2.xml del Application Server agregamos el parámetro “httpContentNegotiation” con el valor true.




Lo mismo hacemos en el fichero axis2_client.xml





Llegado a este punto si consumimos el servicio como antes pues seguiremos viendo la misma respuesta, vean usando curl:

O usando el RESTclient en Firefox:


Probemos ahora a agregar un encabezado del tipo "Accept:application/json"

Si usamos curl:



Vemos que efectivamente la respuesta viene en JSON. Lo mismo nos pasa cuando usamos el cliente en Firefox:




Como ven de una manera muy fácil podemos exponer nuestros servicios web de forma tal que los datos se muestren como JSON.

Espero les sea de utilidad.

martes, 14 de enero de 2014

SOAPUI para la creación de servicios falsos. II


En la primera entrada vimos cómo crear un servicio web falso usando el SOAPUI. En esta segunda entrada veremos cómo realizar lo mismo pero para servicios REST, tanto POX como JSON. Para ello nos apoyaremos en esta entrada

Prerrequisitos:
  1. Tener un fichero response.xml con el XML que se desea retornar.
  2. Tener un fichero jsonresponse.json con el JSON que se desea retornar.

Paso 1: creamos un servicio mock tal y como vimos en la primera entrada.


Paso 2: creamos un script en Groovy que lee de un fichero y devuelve su contenido como una respuesta.


Paso 3:  arrancamos el binding SOAP12, que usaremos para POX, y lanzamos el request para SOAP12, al invocarlo ya podemos ver el resultado en XML.


Si queremos ver el Raw cambiamos de pestaña y podemos ver el tipo de contenido text/xml y la respuesta XML.


Paso 4: realizamos lo mismo pero ahora queremos que la respuesta no sea POX si no JSON.

Abrimos el binding SOAP11 y agregamos el script siguiente:


Vean como creamos un Stream con la información del fichero cargado, y al objeto response le seteamos varias propiedades para al final pasarle el flujo de información del fichero cargado.

Paso 5:  arrancamos el biding soap11 e invocamos a la operación. En este caso vemos que la respuesta es un JSON.


Si queremos ver el Raw cambiamos de pestaña y listo.

Otra manera de probarlo es usando el plugin RESTClient  del Firefox como pueden ver en la imágenes siguientes:


Espero les sea de utilidad.

martes, 18 de junio de 2013

Uso de XStream en un cliente RESTful para un servicio en WSO2

En otra entrada habíamos visto un ejemplo de consumo de un servicio de datos expuesto como RESTful usando jersey. También habíamos comentado que se podía obtener los valores del XML usando XStream y ese es el objetivo de esta entrada.

Para eso le dejamos el fuente de los 2 proyectos nuevamente  y una imagen de cómo queda el cliente.


Nuevamente les dejo imágenes de las estadísticas en el Dashboard del servicio en el Application Server de WSO2.

Para el consumo del clientes RESTful



Con una demora en el cliente de 43segundos en una primer corrida y 44 en una segunda corrida.


Para el consumo del servicio Axis2.


Con una demora en el cliente de 37segundos en una primera corrida y luego 36 en una segunda.

Además de las recomendaciones de la entrada anterior habría que hacer lo siguiente:
  • Cambiar implementaciones del framework para trabajar con el XML en el ejemplo de REST, tal vez usar JAXB a ver que pasa.
  • Tabular los resultados de diferentes corridas para cada ejemplo y poder sacar estadisticas más claras de los resultados.



En esta entrada quisiera mostrarles como consumir este servicio de acceso a datos RESTful usando la librería Jersey y además una comparativa entre el consumo usando esta variante y la de un cliente axis2.
No es objetivo decir que una variante sea mejor que la otra si no que vean los números y puedan elaborar comparativas más claras en este tema.

Para crear un proyecto que implemente un cliente de un servicio web RESTful con jersey solo basta seguir los siguientes pasos:

Crear un proyecto Maven con el arquetipo “Maven-archetype-quickstart”






En el pom del proyecto creado incluir la dependencia a jersey como pueden ver en esta imagen.


Implementar el cliente como sigue:


Este cliente es realmente sencillo, el parámetro se lo estamos incluyendo en la misma URL del servicio, aunque jersey deja pasarle múltiples parámetros y con diferentes propiedades.
El resultado no lo estamos utilizando para nada, solo lo obtenemos y no extraemos información útil del mismo. Solo basta decir que es un XML y con una librería como XStream se podrían obtener sus valores.

Un ejemplo de resultado es este:



Para la comparativa e implementado un cliente axis2 creando también un proyecto Maven. De hecho lo que hice fue crear un cliente axis2 usando el dashboard del Developers Studio de WSO2 y luego pasé el proyecto a Maven.


El cliente es realmente sencillo:


En este caso como pueden ver no solo obtenemos la respuesta si no que vamos al valor dentro del XML y lo imprimimos en pantalla.
En ambas pruebas hicimos unas 10000 iteraciones para ver cómo se comportaba el tiempo de respuesta. Aclaro que no es una prueba válida ni sujeta a criterios comparativos fiables, es solo la base para que todo el que quiera probar tenga un inicio rápido.

En esta imagen pueden ver el tiempo de respuesta del servicio usando el cliente restful luego de 2 peticiones fallidas y 20019 peticiones válidas.


Como pueden ver el tiempo máximo fue de 121ms y el promedio de respuesta fue de 0.248ms


En esta otra imagen tienen lo mismo pero sumándole 2 llamadas al cliente axis2 del servicio de acceso a datos, recuerden que cada llamada lleva un ciclo dentro.
Como pueden ver el tiempo máximo no se ha excedido y el promedio ha bajado un poco, nada significativo.


Las pruebas fueron realizadas localmente y sería interesante:

  1. Trabajar con el XML obtenido con el cliente RESTful para que se asemeje más al cliente axis2.
  2. Incluir diferentes tamaños de los mensajes de request y response.
  3. Implementar el escenario de forma remota y no local.

Creo que así las pruebas tendrían un poco más de valor para decidirnos qué tipo de cliente usar.

Les adjunto:
Proyecto Maven para el cliente RESTful.
Proyecto Maven para el cliente Axis2.

Espero les sea de utilidad.