home · books · notes

O básico sobre fetch()

Fetch, permite fazer request da mesma forma como era feito antigamente com o XMLHttpRequest. Uma das diferenças é que ele utiliza Promisses, o que gera uma API limpa e simples.

Request básico

Fetch recebe dois parâmetros, um sendo a url, e o outro as opções:

fetch('/site/url')
  .then(function(response) { // Resposta })
  .catch(function(err) { // Errou! });

Se você usar es6 fica ainda mais bonito:

fetch("/site/url")
  .then((response) => console.log(response))
  .catch((err) => console.log("Errou!"));

Lidando com JSON

Se você for usar JSON, o parâmetro do callback tem um método chamado .json(), que ira transformar sua resposta em um objeto javascript:

fetch("/site/url/json")
  .then(function (response) {
    // Converte para JSON
    return response.json();
  })
  .then(function (js) {
    // Objeto javascript
    console.log(js);
  });

Text

Se o seu serviço recebe um HTML como resposta, aqui está como você lida com uma resposta em html ou texto:

fetch("/site/url")
  .then(function (response) {
    // Transforma em texto
    return response.text();
  })
  .then(function (txt) {
    // String
    console.log(txt);
  });

Headers and Metadatas

Response headers e metadatas são encontrados no objeto response, e o método get é mostrado a seguir:

fetch("/site/url").then(function (response) {
  console.log(response.headers.get("Content-Type"));
  console.log(response.headers.get("Date"));
  console.log(response.status);
  console.log(response.statusText);
  console.log(response.type);
  console.log(response.url);
});

Você também pode setar headers no seu request, mas não pode setar cookies.

fetch("/site/url", {
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json",
  },
});

Método POST

Você também pode usar esse método com o fetch, basta setar as opções como eu mostro a seguir.

fetch("/site/url", {
  method: "post",
  headers: {
    "Content-type": "application/x-www-form-urlencoded",
  },
  body: "a=1&b=2",
})
  .then(function (res) {
    return res.json();
  })
  .then(function (data) {
    console.log("Resposta em JSON", data);
  })
  .catch(function (error) {
    console.log("Faustão fellings", error);
  });

Compatibilidade

Fetch ainda não tem suporte em 100% dos browsers mas você pode usar um polyfill feito pelo pessoal do github.

O intuito desse post foi mostrar o básico se você deseja saber ainda mais recomendo a leitura desse posts que vale muito a pena.