# HTTP Request

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

{% hint style="danger" %}
**Atenção:** A biblioteca `request` está deprecated, portanto opte por utilizar **flavor** como `axios`
{% endhint %}

## Estrutura

```javascript
[
    {
        "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: <br>

    [Lista de opções da biblioteca axios](https://github.com/axios/axios#request-config)

  * **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`

```javascript
  {
    "statusCode": 200,
    "headers": "<headers do retorno da requisição>",
    "body": "<body do retorno da requisição>"
  }
```

{% tabs %}
{% tab title="Exemplo 1" %}

```javascript
[
    {
        "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:

```javascript
{
    "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:

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

{% endtab %}

{% tab title="Exemplo 2" %}
Uma chamada que possui um `body` e `headers` para autenticação de acesso.

```javascript
[
    {
        "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"
    }
]
```

{% endtab %}
{% endtabs %}

## HTTP\_Request Async&#x20;

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:  <br>

    [Lista de opções da biblioteca axios](https://github.com/axios/axios#request-config)

  * **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.

{% tabs %}
{% tab title="Pending" %}
Informa que a requisição está em andamento

![](/files/-MPGACwp4McPnv7t9tZU)

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

{% endtab %}

{% tab title="Done" %}
Indica que a chamada foi concluída com sucesso

![](/files/-MPGARSypGCgELRvZog1)

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

{% endtab %}

{% tab title="Error" %}
Indica que algo de errado aconteceu no processo

![](/files/-MPGArc9p5ptJQzcPhJ6)

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

{% endtab %}
{% endtabs %}

### 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.

![](/files/-MLiawFQeQoQpTt4_taS)

## Filtro de resposta

Utilize filtros para obter respostas de APIs no Builder utilizando o [**JSONPATH-PLUS**](https://www.npmjs.com/package/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:<br>

    [Lista de opções da biblioteca axios](https://github.com/axios/axios#request-config)

  * **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`&#x20;
* **Escaping**
  * `` ` ``: para utilizar caracteres reservados. ex: `` `$ ``
  * Em casos mais complexos também é possível utilizar:
    * `@['...']`/`?@['...']`&#x20;

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

{% tabs %}
{% tab title="$..\*" %}

```
"body": [
            "37500-242",
            "Rua Comendador Antônio Rodrigues de Oliveira",
            "",
            "Cruzeiro",
            "Itajubá",
            "MG",
            "3132404",
            "",
            "35",
            "4647"
        ]
```

{% endtab %}

{% tab title="$..\*\~" %}

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

{% endtab %}

{% tab title=" $..bairro" %}

```
"body": [
            "Cruzeiro"
        ]
```

{% endtab %}

{% tab title="$..\[bairro, ibge]" %}

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

{% endtab %}
{% endtabs %}

###

### 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
  }
}
}
```

{% tabs %}
{% tab title="$..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
                }
            ]
        ]
```

{% endtab %}

{% tab title="$..author" %}

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

{% endtab %}

{% tab title="$..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
            }
        ]
```

{% endtab %}

{% tab title="$..book\[1]" %}

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

{% endtab %}

{% tab title="$..book\[-1:]" %}

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

{% endtab %}

{% tab title="$..book\[?(@.price ===8.99)]" %}

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

{% endtab %}

{% tab title="$..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
            }
        ]
```

{% endtab %}

{% tab title="$..book\[1]\[?(@property !== "category")]" %}

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

{% endtab %}

{% tab title="$.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
            }
        ]
```

{% endtab %}

{% tab title="$..book..\*@number()" %}

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

{% endtab %}
{% endtabs %}

{% hint style="info" %}
Você pode testar a sua expressão no site:  <https://jsonpath-plus.github.io/JSONPath/demo/>
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.altu.d1.cx/build/assistentes/builder/componentes/actions/http_request.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
