Integração com HTTPS e JSONata
Descrição
No contexto de uma compra em um comércio eletrônico, considere uma integração que gerencia o processamento de pagamentos através das seguintes etapas:
-
Recebimento do pedido
-
Busca de informações da compra
-
Transformação dos dados
-
Processamento do pagamento
-
Atualização do status
-
Resposta final
Veja o script completo e o diagrama da integração.
Confira abaixo a descrição das etapas executadas:
-
Recebimento do pedido
O fluxo começa quando um pedido é recebido com um código de identificação (ClientID). A requisição
POST
é encaminhada para o endpoint/simple
. A resposta recebida é registrada nos logs.- from: uri: rest:post:/simple - setProperty: expression: simple: expression: ${header[ClientID]} name: "clientID" - log: message: ${exchangeProperty.clientID}
-
Busca de informações da compra
Com o ClientID, o sistema faz uma consulta a um serviço interno para obter mais detalhes. A consulta
GET
é realizada em um endpoint de compras, passando o ClientID como parâmetro. A resposta da requisição é registrada nos logs.- toD: uri: https://{{URL}}/interno/compras parameters: bridgeEndpoint: true httpMethod: GET ClientID: '${exchangeProperty.clientID}' - log: message: 'COMPRAS - ${body}'
-
Transformação dos dados
As informações recebidas são processadas e formatadas usando uma ferramenta de transformação, o JSONata. A transformação aplicada é registrada nos logs para verificação.
- to: uri: jsonata:classpath:extractTotal.jsonata parameters: inputType: JsonString - log: message: 'TRANSFORMAÇÃO - ${body}'
-
As instruções para criar um novo objeto JSON estão no arquivo
extractTotal.jsonata
, disponível na pasta Resources. -
O arquivo
extractTotal.jsonata
está referenciado no script do fluxo junto aoclasspath
(trecho acima). -
Veja abaixo o conteúdo do arquivo
extractTotal.jsonata
:
{ "Conta": Cliente.Conta, "TipoPagamento": Cliente.TipoPagamento, "Valor": $sum(Cliente.Ordens.Produto.(Preco * Quantidade)) }
-
Consulte como criar um arquivo na pasta Resources.
-
-
Processamento do pagamento
Os dados processados são então enviados a um serviço externo para efetuar o pagamento. Primeiro, o corpo da mensagem transformada é convertido para o formato JSON, e os cabeçalhos
Content-Type
(definido como application/json) eAuthorization
(com um token de exemplo) são configurados. Em seguida, é feita uma requisiçãoPOST
para o endpoint de pagamento. A resposta recebida é registrada nos logs.- marshal: json: library: Jackson - setHeader: expression: constant: expression: application/json name: Content-Type - setHeader: expression: constant: expression: 'Bearer tokenDeAutorizacaoExemplo' name: Authorization - toD: uri: https://{{URL}}/externo/pagamento parameters: bridgeEndpoint: true httpMethod: POST - log: message: 'PAGAMENTO - ${body}'
-
Atualização do status
Após o processamento do pagamento, o resultado é combinado com o ClientID e transformado novamente para atualizar o status do pagamento em um serviço interno. O corpo da mensagem ajustada é convertido para o formato JSON e enviado em uma requisição
POST
para um endpoint de status.- setBody: expression: simple: expression: '{"ClientID": "${exchangeProperty.clientID}", "status":${body}}' - log: message: 'CONCATENAÇÃO - ${body}' - to: uri: jsonata:classpath:statusPayload.jsonata parameters: inputType: JsonString - log: message: 'STATUS PAYLOAD - ${body}' - marshal: json: library: Jackson - setHeader: expression: constant: expression: application/json name: Content-Type - toD: uri: https://{{URL}}/interno/status parameters: bridgeEndpoint: true httpMethod: POST
-
As instruções para criar um novo objeto JSON estão no arquivo
statusPayload.jsonata
, disponível na pasta Resources. -
O arquivo
statusPayload.jsonata
está referenciado no script do fluxo junto aoclasspath
(trecho acima). -
Veja abaixo o conteúdo do arquivo
statusPayload.jsonata
:
{ "ClientID": ClientID, "Status":status.status }
-
Consulte como criar um arquivo na pasta Resources.
-
-
Resposta final
O sistema envia uma confirmação final para indicar que o pagamento foi bem-sucedido.
O código de resposta HTTP é definido como 200
, e o corpo da resposta confirma o sucesso da operação.
Além disso, o conteúdo da resposta final é registrado nos logs.
- setHeader:
expression:
constant:
expression: "200"
name: CamelHttpResponseCode
- setBody:
expression:
simple:
expression: '{"success": "true"}'
- log:
message: ${body}
Script do fluxo
Veja abaixo o script completo do fluxo de integração descrito:
- from:
uri: rest:post:/simple
steps:
- setProperty:
expression:
simple:
expression: ${header[ClientID]}
name: "clientID"
- log:
message: ${exchangeProperty.clientID}
- toD:
uri: https://{{URL}}/interno/compras
parameters:
bridgeEndpoint: true
httpMethod: GET
ClientID: '${exchangeProperty.clientID}'
- log:
message: 'COMPRAS - ${body}'
- to:
uri: jsonata:classpath:extractTotal.jsonata
parameters:
inputType: JsonString
- log:
message: 'TRANSFORMAÇÃO - ${body}'
- marshal:
json:
library: Jackson
- setHeader:
expression:
constant:
expression: application/json
name: Content-Type
- setHeader:
expression:
constant:
expression: 'Bearer tokenDeAutorizacaoExemplo'
name: Authorization
- toD:
uri: https://{{URL}}/externo/pagamento
parameters:
bridgeEndpoint: true
httpMethod: POST
- log:
message: 'PAGAMENTO - ${body}'
- setBody:
expression:
simple:
expression: '{"ClientID": "${exchangeProperty.clientID}", "status":${body}}'
- log:
message: 'CONCATENAÇÃO - ${body}'
- to:
uri: jsonata:classpath:statusPayload.jsonata
parameters:
inputType: JsonString
- log:
message: 'STATUS PAYLOAD - ${body}'
- marshal:
json:
library: Jackson
- setHeader:
expression:
constant:
expression: application/json
name: Content-Type
- toD:
uri: https://{{URL}}/interno/status
parameters:
bridgeEndpoint: true
httpMethod: POST
- setHeader:
expression:
constant:
expression: "200"
name: CamelHttpResponseCode
- setBody:
expression:
simple:
expression: '{"success": "true"}'
- log:
message: ${body}
Componentes e EIPs
Componentes | EIPs |
---|---|
HTTPS |
from |
JSONata |
log |
REST |
marshal |
setBody |
|
setHeader |
|
setProperty |
|
to |
|
toD |
Confira a descrição de cada componente e EIP. |
Share your suggestions with us!
Click here and then [+ Submit idea]