# fetch

A função `fetch()` envia uma requisição HTTP a partir do seu código no Azion Runtime e retorna uma promise que resolve em um [Response](/pt-br/documentacao/devtools/runtime/api-reference/response/). Você lê essa resposta, a altera ou a devolve ao cliente por meio de `event.respondWith()` ou do valor de retorno do seu handler. `fetch()` faz parte da [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API), que também define os objetos [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) e [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response), o CORS e a semântica do cabeçalho HTTP `Origin`. Com esses objetos, seu código trata, modifica ou constrói requisições e respostas enquanto responde a uma requisição.

Use `fetch()` para encaminhar uma requisição a um servidor de origem e retornar a resposta dele, ou para chamar uma API REST ou GraphQL que fornece parte de uma resposta. Você também pode combinar dados de vários backends em uma única function, ou buscar assets ou configurações remotas e reescrevê-los antes da entrega.

> **nota**
>
> Com `azion dev`, uma resposta de `fetch()` informa `type` como `default`, e `redirected` continua `false` depois de um redirecionamento seguido. Um redirecionamento com `redirect: 'error'` rejeita com `TypeError: fetch failed`, e um timeout expirado rejeita com a mensagem `The operation was aborted due to timeout`.

---

## Sintaxe

```javascript
fetch(request, init)
```

| Parâmetro | Tipo                   | Descrição                                                                  |
| --------- | ---------------------- | -------------------------------------------------------------------------- |
| `request` | `Request` ou string    | Requisição a enviar: um objeto `Request` ou uma string com a URL a buscar. |
| `init`    | Object (`RequestInit`) | Opções da requisição.                                                      |

O objeto `init` aceita estas opções. `method`, `headers`, `body` e `redirect` são os campos que o objeto [Request](/pt-br/documentacao/devtools/runtime/api-reference/request/#propriedades) documenta, e `signal` cancela a requisição:

| Opção      | Tipo             | Descrição                                                                                                                                                                                                                                                                                 |
| ---------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `method`   | String           | Método da requisição, como `POST`.                                                                                                                                                                                                                                                        |
| `headers`  | Objeto `Headers` | Cabeçalhos da requisição.                                                                                                                                                                                                                                                                 |
| `body`     | —                | Payload da requisição, como uma string JSON.                                                                                                                                                                                                                                              |
| `redirect` | String           | Modo de redirecionamento: `follow`, `error` ou `manual`. Com `follow`, o padrão, `fetch()` segue o redirecionamento e resolve na resposta final. Com `manual`, ela resolve na resposta de redirecionamento, como um `301` com o cabeçalho `location`. Com `error`, a promise é rejeitada. |
| `signal`   | `AbortSignal`    | Sinal que cancela a requisição, como `AbortSignal.timeout(300)` para parar de esperar após 300 ms.                                                                                                                                                                                        |

---

## Limites

Cada chamada `fetch()` é executada dentro do teto de tempo de relógio da sua invocação: 5 minutos, com a espera de I/O incluída. Uma invocação também pode fazer um número limitado de chamadas `fetch()` de saída. Para os dois valores, consulte [Limites de Functions](/pt-br/documentacao/plataforma/functions/limites/).

Para limitar uma única chamada, passe `AbortSignal.timeout()` como `signal` em `init`. A promise então é rejeitada com um erro cujo `name` é `TimeoutError`, que seu código captura.

---

## Erros

A promise que `fetch()` retorna é rejeitada com estes erros em uma function após o deploy:

| Erro                                                                                  | Causa                                                                                                                                         | O que fazer                                                             |
| ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `TimeoutError: Signal timed out.`                                                     | O `AbortSignal.timeout()` passado como `signal` expirou antes de a resposta chegar. O erro é uma `DOMException` cujo `name` é `TimeoutError`. | Capture a rejeição e verifique `error.name`, ou passe um timeout maior. |
| `TypeError: Fetch failed: Encountered redirect while redirect mode is set to 'error'` | O servidor respondeu com um redirecionamento, e `redirect` é `error`.                                                                         | Defina `redirect` como `follow` ou `manual`, ou capture a rejeição.     |

---

## Exemplo

Este listener responde a cada requisição com a resposta que `fetch()` recebe de `https://example.com`:

```javascript
addEventListener("fetch", event => {
  return event.respondWith(
    fetch("https://example.com")
  )
})
```

O listener retorna uma resposta com este status, este tipo de conteúdo e este corpo. Os outros cabeçalhos da resposta foram cortados, e o corpo foi cortado depois do título:

```json
{
 "status": 200,
 "statusText": "OK",
 "headers": {
  …
  "content-type": "text/html; charset=utf-8",
  …
 },
 "body": "<!doctype html><html lang=en><head><meta charset=utf-8><link rel=icon href=data:,><meta name=viewport content=\"width=device-width,initial-scale=1\"><title>Example Domain</title>…"
}
```

---

## Recursos relacionados

- [Response](/pt-br/documentacao/devtools/runtime/api-reference/response.md): As propriedades e os métodos do `Response` em que `fetch()` resolve.
- [Request](/pt-br/documentacao/devtools/runtime/api-reference/request.md): Como construir um objeto `Request` para passar para `fetch()`.
- [Handlers](/pt-br/documentacao/devtools/runtime/api-reference/handlers.md): Como uma function recebe uma requisição e retorna uma resposta.
- [fetch na MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/fetch): A especificação completa de `fetch()`, com todos os parâmetros, o valor de retorno e as exceções.
