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.
- A flag
waitTimedeve ser utilizada junto comasynce 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. - A flag
asyncaceita os valorestrueoufalse. Se não especificada, o valor padrão seráfalse, seguindo o comportamento dohttp_requesttradicional. Já a flagwaitTimedeve 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": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
{
"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": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
|
"body": [ |
💡 Dica: Você pode testar a sua expressão no site: https://jsonpath-plus.github.io/JSONPath/demo/