# Request

A interface `Request` representa uma requisição HTTP na [Fetch API](/pt-br/documentacao/devtools/runtime/api-reference/fetch/) do Azion Runtime. Uma function recebe cada requisição como um `Request`: o argumento `request` de um [handler](/pt-br/documentacao/devtools/runtime/api-reference/handlers/) `fetch(request, env, ctx)`, ou `event.request` em um listener que recebe um [FetchEvent](/pt-br/documentacao/devtools/runtime/api-reference/fetch-event/). Você também constrói um `Request` para passar para `fetch()`. Para mais informações, consulte [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) na MDN Web Docs.

> **nota**
>
> Com `azion dev`, uma atribuição a uma propriedade da requisição recebida é ignorada sem erro, e `request.metadata` é `undefined`.

---

## Construtor

```javascript
new Request(input, init)
```

| Parâmetro | Tipo                | Obrigatório | Descrição                                                                                    |
| --------- | ------------------- | ----------- | -------------------------------------------------------------------------------------------- |
| `input`   | String ou `Request` | Sim         | Recurso a requisitar, como uma URL ou como um objeto `Request`.                              |
| `init`    | Object              | Não         | Opções que definem o método, os headers, o corpo e o modo de redirecionamento da requisição. |

O objeto `init` aceita estas opções:

| Opção      | Tipo                                                                                              | Descrição                                                |
| ---------- | ------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `method`   | String                                                                                            | Método da requisição, como `GET` ou `POST`.              |
| `headers`  | Objeto [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers) ou um objeto simples | Headers da requisição.                                   |
| `body`     | String, ou o `body` de outra requisição                                                           | Conteúdo do corpo da requisição.                         |
| `redirect` | String                                                                                            | Modo de redirecionamento: `follow`, `error` ou `manual`. |

O construtor normaliza a URL: `new Request('https://example.com')` tem a `url` `https://example.com/`.

---

## Propriedades

| Propriedade | Tipo                                                                  | Descrição                                                                                                                                                                                                                                    |
| ----------- | --------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `body`      | `ReadableStream` ou `null`                                            | Conteúdo do corpo, lido como um stream. `null` quando a requisição não tem corpo, como uma requisição `GET` recebida. Para mais informações, consulte [ReadableStream](/pt-br/documentacao/devtools/runtime/api-reference/readable-stream/). |
| `bodyUsed`  | Boolean                                                               | `false` até que o corpo seja lido e, depois disso, `true`.                                                                                                                                                                                   |
| `headers`   | [`Headers`](https://developer.mozilla.org/en-US/docs/Web/API/Headers) | Headers da requisição.                                                                                                                                                                                                                       |
| `metadata`  | Object                                                                | Metadados da requisição recebida, disponíveis em uma function após o deploy. Para mais informações, consulte [API de metadados](/pt-br/documentacao/devtools/runtime/api-reference/metadata/).                                               |
| `method`    | String                                                                | Método da requisição, como `GET` ou `POST`.                                                                                                                                                                                                  |
| `redirect`  | String                                                                | Modo de redirecionamento: `follow`, `error` ou `manual`. Uma requisição recebida tem `follow`.                                                                                                                                               |
| `url`       | String                                                                | URL completa da requisição, incluindo a query string, como `https://example.com/a?b=1`.                                                                                                                                                      |

Toda propriedade da requisição recebida é somente leitura. Em uma function após o deploy, uma atribuição como `request.url = 'https://example.com/'` lança `TypeError: Cannot set property url of [object Request] which has only a getter`. Para alterar uma requisição, construa um `Request` e passe em `init` os valores que você mantém, como faz o exemplo abaixo.

---

## Métodos

| Método           | Descrição                                                                                |
| ---------------- | ---------------------------------------------------------------------------------------- |
| `request.text()` | Lê o corpo como uma string. Retorna uma promise. Depois da chamada, `bodyUsed` é `true`. |

Em uma function após o deploy, a requisição também tem `arrayBuffer()`, `blob()`, `bytes()`, `clone()`, `formData()` e `json()`. Para o comportamento desses métodos, consulte [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) na MDN Web Docs.

---

## Exemplo

Este listener constrói um `Request` para `https://example.com` com o método, os headers, o corpo e o modo de redirecionamento da requisição recebida. Em seguida, ele retorna com `Response.json()` três propriedades da requisição que construiu:

```javascript
addEventListener("fetch", (event) => {
  const request = event.request;
  const url = "https://example.com";

  const myRequest = new Request(url, {
    body: request.body,
    headers: request.headers,
    method: request.method,
    redirect: request.redirect,
  });

  event.respondWith(
    Response.json({
      method: myRequest.method,
      url: myRequest.url,
      redirect: myRequest.redirect,
    })
  );
});
```

Para uma requisição `GET` recebida, a function retorna estes valores da requisição que constrói:

```json
{
 "method": "GET",
 "url": "https://example.com/",
 "redirect": "follow"
}
```

---

## Recursos relacionados

- [fetch](/pt-br/documentacao/devtools/runtime/api-reference/fetch.md): Como uma function envia um `Request` e recebe uma resposta.
- [FetchEvent](/pt-br/documentacao/devtools/runtime/api-reference/fetch-event.md): O evento que carrega a requisição recebida como `event.request`.
- [Response](/pt-br/documentacao/devtools/runtime/api-reference/response.md): Como construir a resposta que uma function retorna.
- [Web APIs](/pt-br/documentacao/devtools/runtime/api-reference/javascript.md): As outras Web APIs que o Azion Runtime suporta.
