HTTP Request

Realiza uma chamada HTTP e retorna o resultado em uma variável de contexto.

Atenção: A biblioteca request está deprecated, portanto opte por utilizar flavor como axios

Estrutura

[
    {
        "name": "http_request",
        "parameters": {
            "config": {
                "url": "https://api.altu.com.br/teste",
                "data": {
                    "param1": "value1",
                    "param2": "value2",
                    "param3": "<? $var_contexto ?>",
                },
                "method": "POST",
                "headers": {
                    "Authorization": "meu_token"
                }
            },
            "flavor": "axios",
            "before_action_messages": [
                "Mensagem 1",
                "Mensagem 2"
            ]
        },
        "result_variable": "api_response"
    }
]
  • name: http_request

  • parameters:

    • config: configuração da chamada https que será feita. Deve conter a opção da biblioteca indicada no atributo flavor(biblioteca axios do NodeJS). Abaixo segue exemplo:

      Lista de opções da biblioteca axios

    • url: url da chamada HTTP

    • data: parâmetros da chamada HTTP

    • method: método da chamada HTTP

    • headers: cabeçalho da chamada HTTP

      • Authorization: token de autenticação da chamada

    • flavor: biblioteca que será usada para realizar o request, neste caso, axios

    • before_action_messages: mensagens para serem enviadas ao usuário antes da execução da ação

  • result_variable: variável de contexto que receberá a resposta da chamada HTTP

  {
    "statusCode": 200,
    "headers": "<headers do retorno da requisição>",
    "body": "<body do retorno da requisição>"
  }
[
    {
        "name": "http_request",
        "parameters": {
            "config": {
                "url": "https://viacep.com.br/ws/<?$cep?>/json",
            },
            "flavor": "axios",
            "before_action_messages": [
                "Estamos solicitando a consulta",
                "Aguarde por favor"
            ]
        },
        "result_variable": "api_consulta"
    }
]

No exemplo acima, não são necessários os parâmetros body e headers. É realizada uma consulta ao webservice ViaCEP. Foi passada uma variável de contexto $cep na URL e o retorno é o JSON abaixo:

{
    "body": {
        "uf": "SP",
        "cep": "01243-001",
        "gia": "1004",
        "ibge": "3550308",
        "bairro": "Consolação",
        "unidade": "",
        "localidade": "São Paulo",
        "logradouro": "Rua Sergipe",
        "complemento": "lado ímpar"
    },
    "code": 200,
    "headers": {
        "date": "Fri, 08 Nov 2019 17:09:10 GMT",
        "pragma": "public",
        "server": "nginx/1.16.1",
        "expires": "Fri, 08 Nov 2019 18:09:10 GMT",
        "connection": "close",
        "content-type": "application/json; charset=utf-8",
        "cache-control": "max-age=3600, public",
        "transfer-encoding": "chunked",
        "access-control-max-age": "86400",
        "access-control-allow-origin": "*",
        "access-control-allow-headers": "Content-Type, X-Request-With, X-Requested-By",
        "access-control-allow-methods": "GET, OPTIONS",
        "access-control-allow-credentials": "true"
    }
}

Supondo que deseja manipular essas informações, bastaria acessá-las percorrendo a variável de contexto que, no parâmetro result_variable, armazenou o JSON de resposta. Por exemplo:

<? $api_consulta.body.logradouro ?>
<? $api_consulta.body.bairro ?>
<? $api_consulta.body.localidade ?>

HTTP_Request Async

O Http Request async é uma opção para as ações de requisição assíncrona, ou seja, uma comunicação que não ocorre simultaneamente evitando falhas ou pausa no sistema. Por meio dele é possível utilizar duas flags: async e waitTime, que podem ser adicionadas dentro dos parâmetros do código.

A flag waitTime só pode ser utilizada juntamente com async e permite definir um tempo para realizar a chamada, ou seja, caso classifiquem "waitTime": 60 teremos um tempo de espera de 1 minuto antes que a chamada HTTP seja realizada.

No caso do async são aceitos os valores de true e false, caso não seja especificado será classificado como false por padrão e seguirá o mesmo padrão do http_request. Já no waitTime devem ser utilizados valores em segundos entre 0 e 900 (equivalente a 15 minutos).

Estrutura

[
    {
        "name": "http_request",
        "parameters": {
            "async": true,
            "config": {
                "url": "http://httpstat.us/500?sleep=500",
                "data": {
                    "param1": "value1"
                },
                "method": "POST"
            },
            "flavor": "axios",
            "waitTime": 30
        },
        "result_variable": "api_response"
    }
]

Atributos

  • name: http_request

  • parameters:

    • async: default false. true or false

    • config: configuração da chamada https que será feita. Deve conter a opção da biblioteca indicada no atributo flavor(biblioteca axios do NodeJS). Abaixo segue exemplo:

      Lista de opções da biblioteca axios

    • url: url da chamada HTTP

    • data: parâmetros da chamada HTTP

    • method: método da chamada HTTP

    • flavor: biblioteca que será usada para realizar o request, neste caso, axios

    • waitTime: valores de 0 a 900 (em segundos), quando "async": true.

  • result_variable: variável de contexto que receberá a resposta da chamada HTTP

Responses

Quando async for true o fluxo continua e o result_variable é preenchido com o status Pending, indicando que a requisição está em andamento, ao final da chamada da API é enviada uma nova mensagem atualizando o resultado como Done, ou seja, concluída com sucesso.

Informa que a requisição está em andamento

{
    "flags": {
        "saveContactEnabled": false
    },
    "system": {
        "current_node": null
    },
    "timezone": "America/Sao_Paulo",
    "persistent": {},
    "url_params": {
        "channel": "widget",
        "assistant_id": "29"
    },
    "lastUserInteractionDate": "2020-12-23 15:40:53",
    "api_response": {
        "status": "pending"
    }
}

Exemplos

Após a conclusão da chamada HTTP um input.text é enviado ao assistente com a mensagem "ALTU_ASYNC_HTTP_RESPONSE", possibilitando o envio da resposta da API.

Filtro de resposta

Utilize filtros para obter respostas de APIs no Builder utilizando o JSONPATH-PLUS, basta adicionar o campo responseFilter com a expressão do que você gostaria de filtrar, como no exemplo:

Estrutura

[
    {
        "name": "http_request",
        "parameters": {
            "config": {
                "url": "https://viacep.com.br/ws/37500242/json"
            },
            "flavor": "axios",
            "responseFilter": "$..",
            "before_action_messages": [
                "Estamos solicitando a consulta",
                "Aguarde por favor"
            ]
        },
        "result_variable": "api_consulta"
    }
]

Atributos

  • name: http_request

  • parameters:

    • config: configuração da chamada https que será feita. Deve conter a opção da biblioteca indicada no atributo flavor(biblioteca axios do NodeJS). Abaixo segue exemplo:

      Lista de opções da biblioteca axios

    • url: url da chamada HTTP

    • flavor: biblioteca que será usada para realizar o request, neste caso, axios

    • responseFilter: expressão no formato JSONpath para filtrar a resposta da API

    • before_action_messages(opcional): Mensagem enviada para o usuário antes da execução a ação.

  • result_variable: variável de contexto que receberá a resposta da chamada HTTP

Funcionalidades

  • ^ Busca por elemento igual da expressão

  • ~ Seleciona o nome das propriedades (as array)

  • Seletores possíveis

    • @null(), @boolean(), @number(), @string(), @array(), @object(), @integer( )

    • Seletores para facilitar acesso a estruturas @path/@parent/@property/@parentProperty/@root

  • Escaping

    • `: para utilizar caracteres reservados. ex: `$

    • Em casos mais complexos também é possível utilizar:

      • @['...']/?@['...']

Tabela de sintaxe

Caracteres

Descrição

$

Raiz do objeto ou elemento

@

Objeto ou elemento atual

.

Operador para filhos do objeto

..

Operador descendente recursivo

*

Caractere coringa correspondendo a todos os objetos ou elementos, independentemente de seus nomes

[]

Operador subscrito

[, ]

Operador de união para nomes alternativos ou índices de matriz como um conjunto

[start:end:step]

Operador para dividir o array

?()

Aplica uma lógica de comparação (script)

Tabela de expressões

Caracteres

Descrição

$..

Retorna todos os dados de forma recursiva

$..*

Retorna todos os valores do primeiro nível da resposta da API

$..*~

Retorna todos os nomes dos campos do primeiro nível da resposta da API

$..nome

Retorna os valores encontrados para a variável nome dentro da resposta da API

$..[nome, cidade]

Retorna os valores encontrados para as variáveis nome e cidade dentro da resposta da API

$..nome[1]

Retorna o segundo nome dentro da resposta da API

$..nome[-1:]

Retorna o ultimo nome da resposta da API

$..book.*[?(@property !== "category")]

Retorna todos os campos dos livros, tirando o campo 'category'

Exemplos:

1 - Assumindo uma resposta de API sendo:

"body": {
    "cep": "37500-242",
    "logradouro": "Rua Comendador Antônio Rodrigues de Oliveira",
    "complemento": "",
    "bairro": "Cruzeiro",
    "localidade": "Itajubá",
    "uf": "MG",
    "ibge": "3132404",
    "gia": "",
    "ddd": "35",
    "siafi": "4647"
}
"body": [
            "37500-242",
            "Rua Comendador Antônio Rodrigues de Oliveira",
            "",
            "Cruzeiro",
            "Itajubá",
            "MG",
            "3132404",
            "",
            "35",
            "4647"
        ]

2 - Respostas com composição mais complexa

{
"store": {
  "book": [
    {
      "category": "reference",
      "author": "Nigel Rees",
      "title": "Sayings of the Century",
      "price": 8.95
    },
    {
      "category": "fiction",
      "author": "Evelyn Waugh",
      "title": "Sword of Honour",
      "price": 12.99
    },
    {
      "category": "fiction",
      "author": "Herman Melville",
      "title": "Moby Dick",
      "isbn": "0-553-21311-3",
      "price": 8.99
    },
    {
      "category": "fiction",
      "author": "J. R. R. Tolkien",
      "title": "The Lord of the Rings",
      "isbn": "0-395-19395-8",
      "price": 22.99
    }
  ],
  "bicycle": {
    "color": "red",
    "price": 19.95
  }
}
}
"body": [
            [
                {
                    "category": "reference",
                    "author": "Nigel Rees",
                    "title": "Sayings of the Century",
                    "price": 8.95
                },
                {
                    "category": "fiction",
                    "author": "Evelyn Waugh",
                    "title": "Sword of Honour",
                    "price": 12.99
                },
                {
                    "category": "fiction",
                    "author": "Herman Melville",
                    "title": "Moby Dick",
                    "isbn": "0-553-21311-3",
                    "price": 8.99
                },
                {
                    "category": "fiction",
                    "author": "J. R. R. Tolkien",
                    "title": "The Lord of the Rings",
                    "isbn": "0-395-19395-8",
                    "price": 22.99
                }
            ]
        ]

Você pode testar a sua expressão no site: https://jsonpath-plus.github.io/JSONPath/demo/

Last updated