Search
⌃K
Links
Comment on page

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:
    ​
    • 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>"
}
Exemplo 1
Exemplo 2
[
{
"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 ?>
​
Uma chamada que possui um body e headers para autenticação de acesso.
[
{
"name": "http_request",
"parameters": {
"config": {
"url": "https://api.altu.com.br/teste/consultapessoa",
"data": {
"codigo": "1",
"nome_pessoa": "<? $nome_pessoa ?>"
},
"method": "POST",
"headers": {
"Authorization": "AuZk16BNCHDvzcObTaUiVUnh6F0KJtuD"
}
},
"flavor": "axios",
"before_action_messages": [
"Estamos solicitando a consulta",
"Aguarde por favor"
]
},
"result_variable": "api_consulta"
}
]
​
​

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:
    ​
    • 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.
Pending
Done
Error
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"
}
}
Indica que a chamada foi concluída com sucesso
{
"flags": {
"saveContactEnabled": false
},
"system": {
"current_node": null
},
"timezone": "America/Sao_Paulo",
"persistent": {},
"url_params": {
"channel": "widget",
"assistant_id": "29"
},
"api_response": {
"code": 200,
"headers": {
"date": "Wed, 23 Dec 2020 18:55:19 GMT",
"content-type": "application/json; charset=utf-8",
"transfer-encoding": "chunked",
"connection": "close",
"set-cookie": [
"__cfduid=d14a667e80388165322084722;Path=/;hfsehshkdfxjjfkdjhjkdstat.us"
],
"cache-control": "private",
"vary": "Accept-Encoding",
"x-aspnetmvc-version": "5.1",
"access-control-allow-origin": "*",
"access-control-expose-headers": "Link, Content-Range, Location, WWW-Authenticate, Proxy-Authenticate, Retry-After, Request-Context",
"x-aspnet-version": "4.0.30319",
"request-context": "appId=00000000000000000000000000000000a9",
"x-powered-by": "ASP.NET",
"cf-cache-status": "DYNAMIC",
"cf-request-id": "0000000000000000000000000000000001",
"report-to": "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.00000000mpEjHj9kqDA%2FUg48Gq8b%2000000004800}",
"nel": "{\"report_to\":\"cf-nel\",\"max_age\":604800}",
"server": "cloudflare",
"cf-ray": "60644bd41e084b40-GRU"
},
"body": {
"code": 200,
"description": "OK"
},
"status": "done"
},
"lastUserInteractionDate": "2020-12-23 16:55:19"
}
Indica que algo de errado aconteceu no processo
{
"flags": {
"saveContactEnabled": false
},
"system": {
"current_node": null
},
"timezone": "America/Sao_Paulo",
"persistent": {},
"url_params": {
"channel": "widget",
"assistant_id": "29"
},
"api_response": {
"code": 500,
"status": "error"
},
"lastUserInteractionDate": "2020-12-23 17:02:23"
}

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:
    ​
    • 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"
}
$..*
$..*~
$..bairro
$..[bairro, ibge]
"body": [
"37500-242",
"Rua Comendador Antônio Rodrigues de Oliveira",
"",
"Cruzeiro",
"Itajubá",
"MG",
"3132404",
"",
"35",
"4647"
]
"body": [
"cep",
"logradouro",
"complemento",
"bairro",
"localidade",
"uf",
"ibge",
"gia",
"ddd",
"siafi"
]
"body": [
"Cruzeiro"
]
"body": [
"Cruzeiro",
"3132404"
]

​

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
}
}
}
$..book
$..author
$..isbn^
$..book[1]
$..book[-1:]
$..book[?(@.price ===8.99)]
$..book[?(@.price>9)]
$..book[1][?(@property !== "category")]
$.store.book[?(@path !== "$['store']['book'][0]")]
$..book..*@number()
"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
}
]
]
"body": [
"Nigel Rees",
"Evelyn Waugh",
"Herman Melville",
"J. R. R. Tolkien"
]
"body": [
{
"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
}
]
"body": [
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
]
"body": [
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
]
"body": [
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
}
]
"body": [
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
]
"body": [
"Evelyn Waugh",
"Sword of Honour",
12.99
]
"body": [
{
"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
}
]
"body": [
8.95,
12.99,
8.99,
22.99
]
Você pode testar a sua expressão no site: https://jsonpath-plus.github.io/JSONPath/demo/​