# 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

![](https://776911411-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MBjaNm5lB1Yqgih1JCA%2F-MPG6ZO4N34PQYq2yrFv%2F-MPGACwp4McPnv7t9tZU%2FUntitled%20\(23\).png?alt=media\&token=17ab9801-89b2-4ec5-beb7-d9ca988edd6f)

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

![](https://776911411-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MBjaNm5lB1Yqgih1JCA%2F-MPG6ZO4N34PQYq2yrFv%2F-MPGARSypGCgELRvZog1%2FUntitled%20\(24\).png?alt=media\&token=bdb9669c-881c-44ea-a495-8766f1bbe198)

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

![](https://776911411-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MBjaNm5lB1Yqgih1JCA%2F-MPGAaHxcKVvZ0Kxv04Y%2F-MPGArc9p5ptJQzcPhJ6%2FUntitled%20\(25\).png?alt=media\&token=c7f3c9d0-7f07-4a77-8b00-6a833c35132d)

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

![](https://776911411-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MBjaNm5lB1Yqgih1JCA%2F-MLgsXOJT569YIoa_n9M%2F-MLiawFQeQoQpTt4_taS%2FUntitled%20\(13\).png?alt=media\&token=13945b52-0b40-4ad7-9b3e-ac03604c92ce)

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