Como podemos ajudar?

02. HTTP_Request Async
30 min
Criado por Ligia Sarmento em 20/08/2024 12:04
Atualizado por Ligia Sarmento em 23/08/2024 16:49

O HTTP_Request async é uma opção para executar requisições assíncronas, ou seja, uma comunicação que não ocorre simultaneamente, evitando falhas ou interrupções no sistema. Com ele, é possível utilizar duas flags: async e waitTime, que podem ser adicionadas aos parâmetros da solicitação.

  1. A flag waitTime deve ser utilizada junto com async e permite definir um tempo de espera antes de realizar a chamada. Por exemplo, ao definir "waitTime": 60, haverá um atraso de 1 minuto antes que a solicitação HTTP seja executada.
  2. A flag async aceita os valores true ou false. Se não especificada, o valor padrão será false, seguindo o comportamento do http_request tradicional. Já a flag waitTime deve ser configurada com valores em segundos, variando entre 0 e 900 (equivalente a 15 minutos).

A seguir, veja um exemplo funcional da estrutura de uma requisição:

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). 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 é definido como true, o fluxo continua e a result_variable é inicialmente preenchida com o status Pending, indicando que a requisição está em andamento. Ao término da chamada da API, uma nova mensagem é enviada, atualizando o status para Done, sinalizando que a operação foi concluída com sucesso.

Veja abaixo os exemplos de respostas:

Peding

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"
}
}

Done

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"
}

Error

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, permitindo o envio da resposta da API.

Filtro de resposta

Utilize filtros para obter respostas de APIs no Builder utilizando o JSONPATH-PLUS. Para isso 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). 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 assumindo a resposta de API como:

"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"
]

 

$..*~

"body": [
"cep",
"logradouro",
"complemento",
"bairro",
"localidade",
"uf",
"ibge",
"gia",
"ddd",
"siafi"
]

 

$..bairro

"body": [
"Cruzeiro"
]

 

$..*

"body": [
"Cruzeiro",
"3132404"
]

 


Exemplos assumindo respostas com composição mais complexa como:
{
"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

"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
}
]
]

 

$..author

"body": [
"Nigel Rees",
"Evelyn Waugh",
"Herman Melville",
"J. R. R. Tolkien"
]

 

$..isbn^

"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
}
]

 

$.book[1]

"body": [
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}
]

 

$..book[-1:]

"body": [
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
]

 

$..book[?(@.price ===8.99)]

"body": [
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
}
]

 

$..book[?(@.price>9)]

"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
}
]

 

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

"body": [
"Evelyn Waugh",
"Sword of Honour",
12.99
]

 

$.store.book[?(@path !== "$['store']['book'][0]")]

"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
}
]

 

$..book..*@number()

"body": [
8.95,
12.99,
8.99,
22.99
]

 

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

Este artigo resolveu sua dúvida?
Últimos artigos visitados