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:

  1. Recebimento do pedido

  2. Busca de informações da compra

  3. Transformação dos dados

  4. Processamento do pagamento

  5. Atualização do status

  6. Resposta final

Veja o script completo e o diagrama da integração.

flow source code https

Confira abaixo a descrição das etapas executadas:

  1. 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}
  2. 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}'
  3. 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 ao classpath(trecho acima).

    • Veja abaixo o conteúdo do arquivo extractTotal.jsonata:

    {
       "Conta": Cliente.Conta,
       "TipoPagamento": Cliente.TipoPagamento,
       "Valor": $sum(Cliente.Ordens.Produto.(Preco * Quantidade))
    }
  4. 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) e Authorization (com um token de exemplo) são configurados. Em seguida, é feita uma requisição POST 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}'
  5. 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 ao classpath(trecho acima).

    • Veja abaixo o conteúdo do arquivo statusPayload.jsonata:

    {
        "ClientID": ClientID,
        "Status":status.status
    }
  6. 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}

Diagrama

https diagrama

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.
Thanks for your feedback!
EDIT

Share your suggestions with us!
Click here and then [+ Submit idea]