El ejemplo Servicio web RESTful utilizando JSON muestra cómo utilizar algunas de las características del analizador de JSON que se proporcionan en WebSphere Message Broker. En el ejemplo se utiliza una interfaz REST para una aplicación WebSphere MQ. La aplicación WebSphere MQ utiliza mensajes XML para gestionar una lista de datos de disco compacto (CD).
Este ejemplo consta de tres componentes principales.
Para cada uno de los flujos de mensajes, un cliente de prueba del mismo nombre dirige el flujo.
El diagrama siguiente muestra la estructura del proveedor de servicios web para este ejemplo, httpjsonrestprovider, en el proyecto de Message Broker JSONRESTSample.
El nodo HTTPInput, la Entrada JSON HTTP, está a la escucha de un mensaje y tiene seleccionada la propiedad Analizar serie de consulta. Si el URI de solicitud contiene una serie de consulta (utilizada por JSONP), la serie de consulta se guarda en el entorno local. El nodo HTTPInput también tiene seleccionada la propiedad Establecer lista de destinos, que añade el método HTTP a la ruta de la lista de destinos de etiqueta en el nodo RouteToLabel, método REST RouteTo. La ruta de la lista de destinos de etiqueta se utiliza posteriormente en el flujo de mensajes.
El siguiente nodo es un nodo Compute, StoreHttpReqId. Este nodo Compute guarda el destino, que se extrae de la última parte del URI de la solicitud. Por ejemplo, http://localhost:7080/jsonrequest/target. Este nodo Compute también guarda el ID de solicitud HTTP. El destino y el ID de solicitud HTTP se guardan en el entorno, para utilizarlos posteriormente en el flujo.
Según el método HTTP del mensaje de entrada, el mensaje se pasa a o un nodo JavaCompute o a un nodo Compute.
Aunque la función de estos nodos es comparable, muestran cómo acceder al árbol JSON y cómo convertir el mensaje en otro formato de datos (XML) utilizando Java o ESQL.
Para obtener más información sobre el uso de distintos lenguajes, incluido PHP, para acceder a JSON, consulte Modificación de un mensaje JSON en la documentación de WebSphere Message Broker.
A continuación, el mensaje se transfiere a una cola, que es procesada por la aplicación WebSphere MQ de fondo. La aplicación WebSphere MQ de fondo contiene un nodo MQOutput, MQOutput (APP_IN1), que envía un mensaje al nodo Compute, WriteHttpReqId. El nodo Compute WriteHttpReqId crea un mensaje que contiene las variables de entorno local que se han creado anteriormente en el flujo de mensajes. El nodo MQHeader, MQ Header, coloca este mensaje nuevo en la cola, STOREQ1, utilizando el nodo MQOutput, MQOutput (STOREQ1).
El nodo MQInput, MQInput (APP_OUT1), recupera el mensaje de la aplicación WebSphere MQ. El nodo MQGet, MQGet (STOREQ1), recupera un mensaje de correlación de la cola, STOREQ1. Si se produce un error, es capturado por el nodo Throw, ThrowRestoreHttpReqIdError, que se utiliza para forzar un error en la vía de acceso a través del flujo de mensajes si el contenido del mensaje contiene datos inesperados. El nodo Compute, JSON Reply, almacena el identificador de solicitud en el entorno local, que el nodo HTTP Reply, HTTP JSON Reply, utiliza. Si la solicitud HTTP original contiene una serie de consulta, la serie de consulta se utiliza como el valor de relleno en un mensaje JSONP.
Para obtener más información sobre cómo proporcionar y consumir servicios JSONP, consulte Soporte de JSONP en el dominio JSON en la documentación de WebSphere Message Broker.
Este ejemplo contiene dos flujos de mensajes independientes que puede utilizar el servicio web y flujo de mensajes de consumidor JSONP.
En el primer flujo de mensajes, MqJsonClientConsumer.msgflow, se utiliza JSON a través de WebSphere MQ, y se muestra cómo invocar un servicio REST HTTP desde WebSphere MQ utilizando una cola de entrada específica para definir el método REST.
Este flujo de mensajes contiene cuatro nodos MQInput; uno para cada uno de los métodos REST:
El nodo Compute, BuildRestRequest, toma el mensaje de estas colas y compila una solicitud para enviarla al servicio RESTful. De acuerdo con la arquitectura REST, este nodo Compute también amplía el URL de destino con el nombre del objeto sobre el que actúa la solicitud. La propiedad Modalidad de cálculo de este nodo está establecida en Entorno local y mensaje, de modo que los métodos de destino URL y HTTP, almacenados en el entorno local, se pasan a través del flujo de mensajes.
El nodo HTTPRequest, HTTP REST Request, pasa su mensaje al servicio RESTful. El mensaje que devuelve el servicio RESTful depende del método al que se llama.
El nodo Compute, RestoreMQMD, a continuación, restaura la cabecera MQMD en el mensaje de salida y lo envía a la cola JSON_REPLY1 utilizando el nodo MQOutput, MQ Output (JSON_REPLY1).
El segundo flujo de mensajes, MqXmlClientConsumer.msgflow muestra cómo se consume un servicio JSON HTTP RESTful desde un cliente XML de WebSphere MQ, cómo se convierte XML a JSON y cómo se realiza una llamada al método REST correspondiente.
Este flujo de mensajes contiene un solo nodo MQInput, MQ Input (XML_CONS_IN1), a través del cual pasan todos los métodos REST. Dado que el servicio web requiere un mensaje JSON, los nodos Compute, XML-JSON y JSON-XML, transforman el mensaje de XML a JSON y JSON a XML, según corresponda.
El nodo Compute XML-JSON ejecuta tareas similares en el nodo Compute BuildRestRequest, como describe la sección Consumidor JSON de WebSphere MQ. Sin embargo, en vez de utilizar una cola diferente para cada método HTTP, sólo se utiliza una cola y el tipo de método HTTP a utilizar se almacena como un valor en el mensaje XML. Este nodo también establece el elemento de miembro como una matriz de JSON con el código siguiente:
SET OutputRoot.JSON.Data = InputRoot.XMLNSC.Collection.CD; DECLARE membersArray REFERENCE TO OutputRoot.JSON.Data.Members; IF LASTMOVE(membersArray) THEN -- Format the Members element as a JSON Array SET membersArray TYPE = JSON.Array; END IF;
Para obtener más información acerca de la utilización de lenguajes diferentes, incluyendo Java y PHP, para modificar y transformar mensajes JSON, consulte Modificar un mensaje JSON en la documentación De WebSphere Message Broker.
El consumidor JSONP es un programa frontal web que utiliza JavaScript para acceder directamente al proveedor. El diagrama siguiente muestra el resultado de JavaScript en JSONPConsumer.html:
Puede cambiar la consulta modificando el siguiente código JavaScript HTML:
<script type="text/javascript" src="http://localhost:7080/jsonrequest/*?jsonp=parseResponse"></script>Por ejemplo, cambiar la consulta para el código siguiente devuelve cualquier CD con el título "IX":
<script type="text/javascript" src="http://localhost:7080/jsonrequest/IX?jsonp=parseResponse"></script>
Para obtener más información sobre JSONP, consulte Proporcionar un servicio JSONP y Consumir una respuesta de servicio JSONP en la documentación de WebSphere Message Broker.
El diagrama siguiente muestra el flujo de mensajes de la aplicación de fondo de WebSphere MQ, MqXmlApp.msgflow:
Este flujo contiene un nodo MQInput, MQ XML Input (APP_IN1), y un nodo Compute, Application, que inicializa los datos del ejemplo en su primera ejecución. Estos datos se almacenan en una variable de larga duración, que es persiste para el tiempo que el flujo permanece desplegado. El nodo Compute también realiza una función de crear, recuperar, actualizar o suprimir (CRUD) en estos datos, según el contenido del mensaje XML. Por último, el mensaje se propaga a una cola de WebSphere MQ, APP_OUT1, en el nodo MQOutput, MQ XML Output (APP_OUT1).
El flujo de mensajes de consumidor está controlado por un mensaje WebSphere MQ. Se proporciona un archivo de cliente de prueba que ejecuta el ejemplo utilizando los mensajes siguientes:
Cuando el mensaje siguiente se envía a la cola RETRIEVE_IN1, se devuelven los datos sobre todos los CD:
{ "Title" : "*" }
Cuando el mensaje siguiente se envía a la cola RETRIEVE_IN1, los datos del CD se devuelven para cualquier CD con el título "Friars Ball".
{ "Title" : "Friars Ball" }
Ambos mensajes anteriores devuelven un mensaje en el formato siguiente:
{"Title":"Friars Ball","Artist":"Deep Blue","Country":"UK","Price":"9.90","Year":"1971","Members": ["Liam Gillan","Alan Blackmore","Phil Glover","David Paice","Tom Lord"]}
Cuando el mensaje JSON siguiente se envía a la cola DELETE_IN1, se suprimen los datos de cualquier CD con el título "Friars Ball".
{ "Title" : "Friars Ball" }
Si la acción resulta satisfactoria, el mensaje que se devolverá será el siguiente:
{"Status":"Success"}
Si se envía el mensaje siguiente a la cola UPDATE_IN1, los datos de cualquier CD con el título "Friars Ball" se cambia; sólo se devuelve el registro actualizado. Si se envía este mensaje a la cola CREATE_IN1, se crea una entrada completamente nueva y se devuelven todos los datos, incluida la nueva entrada.
{ "Title" : "Friars Ball", "Artist" : "Deep Orange", "Country" : "United Kingdom", "Price" : 19.90, "Year" : 2010, "Members":["Liam Gillan","Alan Blackmore","Phil Glover","David Paice","Tom Lord"] }