A amostra RESTful Web Service Using JSON demonstra como usar alguns dos recursos do analisador JSON fornecidos no WebSphere Message Broker. A amostra usa uma interface REST para um aplicativo WebSphere MQ. O aplicativo WebSphere MQ usa as mensagens XML para gerenciar uma lista de dados do CD.
Essa amostra consiste de três componentes principais.
Para cada um dos fluxos de mensagens, um cliente de teste do mesmo nome direciona o fluxo.
O diagrama a seguir mostra a estrutura do provedor de serviços da Web para essa amostra, HttpJsonRestProvider.msgflow, no projeto do Message Broker JSONRESTSample.
O nó HTTPInput, A Entrada HTTP JSON, atende uma mensagem e possui a propriedade Analisar Sequência de Consulta selecionada. Se o URI de solicitação contiver uma sequência de consulta (usada pelo JSONP), a sequência de consulta será armazenada no ambiente local. O nó HTTPInput também possui a propriedade Configurar Lista de Destino selecionada, que inclui o método HTTP para rotear para a lista de destino de rótulo no nó RouteToLabel, método RouteTo REST. A rota para a lista de destino de rótulo é usada mais tarde no fluxo de mensagens.
O próximo nó é um nó Compute, StoreHttpReqId. Esse nó Compute salva o destino, que extrai a partir da última parte do URI de solicitação. Por exemplo, http://localhost:7080/jsonrequest/target. Esse nó Compute também salva o ID do pedido de HTTP. O destino e o ID de pedido de HTTP são salvos no ambiente para uso posterior no fluxo.
Dependendo do método HTTP da mensagem de entrada, a mensagem é passada para o nó JavaCompute ou para o nó Compute
Embora a função desses nós seja comparável, eles demonstram como acessar a árvore JSON e como converter a mensagem para outro formato de dados (XML) usando Java ou ESQL.
Para obter mais informações sobre o uso de linguagens diferentes, incluindo PHP, para acessar JSON, consulte Modificando uma Mensagem JSON na documentação do WebSphere Message Broker.
A mensagem é então colocada em uma fila, que é processada pelo aplicativo backend do WebSphere MQ. O aplicativo backend do WebSphere MQ contém o nó MQOutput, MQOutput (APP_IN1), que envia uma mensagem para o nó Compute, WriteHttpReqId. O nó Compute WriteHttpReqId cria uma mensagem que contém as variáveis de ambiente local que foram criadas anteriormente no fluxo de mensagens. O nó MQHeader, MQ Header, coloca essa nova mensagem na fila, STOREQ1, usando o nó MQOutput, MQOutput (STOREQ1).
O nó MQInput, MQInput (APP_OUT1), recupera a mensagem do aplicativo WebSphere MQ. O nó MQGet, MQGet (STOREQ1), recupera uma mensagem de correlação a partir da fila, STOREQ1. Se ocorrer um erro, ele será capturado pelo nó Throw, ThrowRestoreHttpReqIdError, que é usado para forçar o caminho de erro por meio do fluxo de mensagens se o conteúdo da mensagem contiver dados inesperados. O nó Compute, JSON Reply, armazena o identificador de solicitação no ambiente local, que é usado pelo nó HTTP Reply, HTTP JSON Reply. Se o pedido de HTTP original contiver uma sequência de consultas, a sequência de consulta será usada como o valor de preenchimento em uma mensagem JSONP.
Para obter mais informações sobre o fornecimento e o consumo de serviços JSONP, consulte Suporte JSONP no domínio JSON na documentação do WebSphere Message Broker.
Essa amostra contém dois fluxos de mensagens separados que podem consumir o serviço da Web e o fluxo de mensagens do consumidor JSONP
O primeiro fluxo de mensagens, MqJsonClientConsumer.msgflow, usa o JSON sobre WebSphere MQ e mostra como chamar um serviço HTTP REST a partir do WebSphere MQ usando uma fila de entrada específica para definir o método REST.
Esse fluxo de mensagens contém quatro nós MQInput; um para cada um dos métodos REST:
O nó Compute, BuildRestRequest, usa a mensagem dessas filas e constrói uma solicitação para enviar para o serviço RESTful. De acordo com a arquitetura REST, esse nó Compute também estende a URL de destino com o mesmo nome do objeto sobre o qual a solicitação atua. A propriedade Modo Compute desse nó é configurada para LocalEnvironment e Mensagem, para que a URL de destino e o método HTTP, que são armazenados no ambiente local, sejam passados pelo fluxo de mensagens.
O nó HTTPRequest, HTTP REST Request, passa a mensagem para o serviço RESTful. A mensagem que é retornada pelo serviço RESTful é dependente do método que está sendo chamado.
O nó Compute, RestoreMQMD, então restaura o cabeçalho MQMD para a mensagem de saída e envia para a fila JSON_REPLY1 usando o nó MQOutput, Saída MQ (JSON_REPLY1).
O segundo fluxo de mensagens, MqXmlClientConsumer.msgflow mostra como consumir um serviço HTTP RESTful JSON a partir de um cliente XML do WebSphere MQ, como converter XML para JSON e como fazer uma chamada de método REST apropriada.
Esse fluxo de mensagens contém um nó MQInput único, MQ Input (XML_CONS_IN1), por meio do qual todos os métodos REST passam. Como o serviço da Web requer uma mensagem JSON, os nós Compute, XML-JSON e JSON-XML, transformam a mensagem de XML para JSON e de JSON para XML apropriadamente.
O nó Compute XML-JSON executa tarefas semelhantes para o nó Compute BuildRestRequest, descrito na seção do Consumidor WebSphere MQ JSON. Entretanto, em vez de usar uma fila diferente para cada método HTTP, apenas uma fila é usada e o tipo do método HTTP a ser usado é armazenado como um valor na mensagem XML. Esse nó também configura o elemento de membro como uma matriz JSON com o seguinte código:
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 obter mais informações sobre o uso de linguagens diferentes, incluindo Java e PHP, para modificar e transformar mensagens JSON, consulte Modificando uma Mensagem JSON na documentação do WebSphere Message Broker.
O consumidor JSONP é um frontend da Web que usa o JavaScript para acessar o provedor diretamente. O seguinte diagrama mostra o resultado do JavaScript no JSONPConsumer.html:
É possível alterar a consulta ao modificar a seguinte tag HTML JavaScript:
<script type="text/javascript" src="http://localhost:7080/jsonrequest/*?jsonp=parseResponse"></script>Por exemplo, alterar a consulta para o seguinte código retorna qualquer CD com o título "IX":
<script type="text/javascript" src="http://localhost:7080/jsonrequest/IX?jsonp=parseResponse"></script>
Para obter mais informações sobre o JSONP, consulte Fornecendo um Serviço JSONP e Consumindo uma resposta de serviço JSONP na documentação do WebSphere Message Broker.
O seguinte diagrama mostra o fluxo de mensagens de aplicativo backend do WebSphere MQ, MqXmlApp.msgflow:
Esse fluxo contém um nó MQInput, MQ XML Input (APP_IN1), e um nó Compute, Application, que inicializa os dados de amostra na primeira execução. Esses dados são armazenados em uma variável de tempo de vida longo, que persiste durante a implementação do fluxo. O nó Compute também executa uma função de criação, recuperação, atualização ou de exclusão (CRUD) nesses dados, dependendo do conteúdo da mensagem XML. Por fim, a mensagem é propagada para uma fila do WebSphere MQ, APP_OUT1, no nó MQOutput, MQ XML Output (APP_OUT1).
O fluxo de mensagens do consumidor é conduzido por uma mensagem do WebSphere MQ. Um arquivo de cliente de teste é fornecido para executar a amostra usando as seguintes mensagens:
Quando a seguinte mensagem é enviada para a fila RETRIEVE_IN1, os dados sobre todos os CDs são retornados:
{ "Title" : "*" }
Quando a seguinte mensagem é enviada para a fila RETRIEVE_IN1, os dados do CD são retornados para qualquer CD com o título "Friars Ball".
{ "Title" : "Friars Ball" }
As duas mensagens anteriores retornam uma mensagem no seguinte formato:
{"Title":"Friars Ball","Artist":"Deep Blue","Country":"UK","Price":"9.90","Year":"1971","Members": ["Liam Gillan","Alan Blackmore","Phil Glover","David Paice","Tom Lord"]}
Quando a seguinte mensagem JSON é enviada para a fila DELETE_IN1, os dados de qualquer CD com o título "Friars Ball" são excluídos.
{ "Title" : "Friars Ball" }
Se for bem sucedido, a seguinte mensagem será retornada:
{"Status":"Success"}
Se a seguinte mensagem for enviada para a fila UPDATE_IN1, os dados de qualquer CD com o título "Friars Ball" serão alterados e apenas o registro atualizado é retornado. Se a mensagem for enviada para a fila CREATE_IN1, uma entrada completamente nova será criada e todos os dados são retornados, incluindo a nova entrada.
{ "Título" : "Friars Ball", "Artista" : "Deep Orange", "País" : "United Kingdom", "Preço" : 19.90, "Ano" : 2010, "Membros":["Liam Gillan","Alan Blackmore","Phil Glover","David Paice","Tom Lord"] }