JavaScript

O que Todo Dev Deve Saber sobre Fetch API em JavaScript: Consumindo APIs REST no Navegador

7 min de leitura

O que Todo Dev Deve Saber sobre Fetch API em JavaScript: Consumindo APIs REST no Navegador

Introdução à Fetch API A Fetch API é a forma moderna e padronizada de fazer requisições HTTP no navegador, substituindo completamente o XMLHttpRequest. Ela oferece uma interface limpa baseada em Promises, tornando o consumo de APIs REST intuitivo e elegante. Quando você precisa buscar dados de um servidor, autenticar usuários ou enviar formulários sem recarregar a página, a Fetch API é sua ferramenta ideal. Diferentemente de bibliotecas externas como Axios, a Fetch API é nativa do JavaScript moderno (disponível em todos os navegadores atuais). Isso significa zero dependências e melhor performance. Você escreve menos código, trata erros de forma consistente e integra-se perfeitamente com async/await. Fundamentos e Sintaxe Básica GET: Recuperando Dados A forma mais simples de usar Fetch é fazer uma requisição GET para obter dados. A função retorna uma Promise que resolve para um objeto . Você deve chamar para parsear o corpo da resposta como JSON. A versão com async/await é mais legível e se tornou o

<h2>Introdução à Fetch API</h2>

<p>A Fetch API é a forma moderna e padronizada de fazer requisições HTTP no navegador, substituindo completamente o XMLHttpRequest. Ela oferece uma interface limpa baseada em Promises, tornando o consumo de APIs REST intuitivo e elegante. Quando você precisa buscar dados de um servidor, autenticar usuários ou enviar formulários sem recarregar a página, a Fetch API é sua ferramenta ideal.</p>

<p>Diferentemente de bibliotecas externas como Axios, a Fetch API é nativa do JavaScript moderno (disponível em todos os navegadores atuais). Isso significa zero dependências e melhor performance. Você escreve menos código, trata erros de forma consistente e integra-se perfeitamente com async/await.</p>

<h2>Fundamentos e Sintaxe Básica</h2>

<h3>GET: Recuperando Dados</h3>

<p>A forma mais simples de usar Fetch é fazer uma requisição GET para obter dados. A função <code>fetch()</code> retorna uma Promise que resolve para um objeto <code>Response</code>. Você deve chamar <code>.json()</code> para parsear o corpo da resposta como JSON.</p>

<pre><code class="language-javascript">// Requisição GET básica

fetch(&#039;https://jsonplaceholder.typicode.com/posts/1&#039;)

.then(response =&gt; response.json())

.then(data =&gt; console.log(data))

.catch(error =&gt; console.error(&#039;Erro:&#039;, error));</code></pre>

<p>A versão com async/await é mais legível e se tornou o padrão na indústria:</p>

<pre><code class="language-javascript">async function obterPost() {

try {

const response = await fetch(&#039;https://jsonplaceholder.typicode.com/posts/1&#039;);

const data = await response.json();

console.log(data);

} catch (error) {

console.error(&#039;Erro na requisição:&#039;, error);

}

}

obterPost();</code></pre>

<h3>POST: Enviando Dados</h3>

<p>Para criar novos recursos, use POST com um objeto de configuração contendo o método HTTP e os headers necessários:</p>

<pre><code class="language-javascript">async function criarPost() {

try {

const response = await fetch(&#039;https://jsonplaceholder.typicode.com/posts&#039;, {

method: &#039;POST&#039;,

headers: {

&#039;Content-Type&#039;: &#039;application/json&#039;,

},

body: JSON.stringify({

title: &#039;Novo Post&#039;,

body: &#039;Conteúdo do post&#039;,

userId: 1

})

});

const data = await response.json();

console.log(&#039;Post criado:&#039;, data);

} catch (error) {

console.error(&#039;Erro ao criar post:&#039;, error);

}

}</code></pre>

<h2>Tratamento de Erros e Status HTTP</h2>

<h3>Verificando o Status da Resposta</h3>

<p>Um erro crítico que iniciantes cometem é acreditar que <code>fetch()</code> rejeita a Promise em caso de erro HTTP. Na verdade, <code>fetch()</code> só rejeita em casos de falha de rede. Você deve verificar manualmente <code>response.ok</code> ou <code>response.status</code>:</p>

<pre><code class="language-javascript">async function buscarComValidacao() {

try {

const response = await fetch(&#039;https://jsonplaceholder.typicode.com/posts/999&#039;);

if (!response.ok) {

throw new Error(Erro HTTP: ${response.status});

}

const data = await response.json();

console.log(data);

} catch (error) {

console.error(&#039;Erro capturado:&#039;, error.message);

}

}</code></pre>

<h3>AbortController: Cancelando Requisições</h3>

<p>Em aplicações reais, você frequentemente precisa cancelar requisições (quando um usuário navega para outra página, por exemplo). Use <code>AbortController</code>:</p>

<pre><code class="language-javascript">const controller = new AbortController();

const timeoutId = setTimeout(() =&gt; controller.abort(), 5000);

fetch(&#039;https://jsonplaceholder.typicode.com/posts&#039;, {

signal: controller.signal

})

.then(response =&gt; response.json())

.then(data =&gt; console.log(data))

.catch(error =&gt; {

if (error.name === &#039;AbortError&#039;) {

console.log(&#039;Requisição cancelada&#039;);

}

})

.finally(() =&gt; clearTimeout(timeoutId));</code></pre>

<h2>Padrões Avançados e Boas Práticas</h2>

<h3>Função Helper Reutilizável</h3>

<p>Crie uma função wrapper que centraliza configurações comuns, como headers de autenticação:</p>

<pre><code class="language-javascript">async function apiRequest(endpoint, options = {}) {

const defaultOptions = {

headers: {

&#039;Content-Type&#039;: &#039;application/json&#039;,

&#039;Authorization&#039;: Bearer ${localStorage.getItem(&#039;token&#039;)}

}

};

const config = { ...defaultOptions, ...options };

const response = await fetch(https://api.exemplo.com${endpoint}, config);

if (!response.ok) {

throw new Error(API Error: ${response.status});

}

return response.json();

}

// Uso

apiRequest(&#039;/usuarios&#039;, { method: &#039;GET&#039; })

.then(usuarios =&gt; console.log(usuarios))

.catch(error =&gt; console.error(error));</code></pre>

<h3>Tratando Diferentes Tipos de Resposta</h3>

<p>Nem sempre a resposta é JSON. Use <code>response.headers.get(&#039;content-type&#039;)</code> para validar:</p>

<pre><code class="language-javascript">async function processarResposta() {

const response = await fetch(&#039;https://jsonplaceholder.typicode.com/posts/1&#039;);

const contentType = response.headers.get(&#039;content-type&#039;);

let data;

if (contentType.includes(&#039;application/json&#039;)) {

data = await response.json();

} else if (contentType.includes(&#039;text/plain&#039;)) {

data = await response.text();

} else {

data = await response.blob();

}

return data;

}</code></pre>

<h3>Upload de Arquivos com FormData</h3>

<p>Para enviar arquivos, use <code>FormData</code> em vez de JSON:</p>

<pre><code class="language-javascript">async function enviarArquivo(arquivo) {

const formData = new FormData();

formData.append(&#039;arquivo&#039;, arquivo);

formData.append(&#039;descricao&#039;, &#039;Meu arquivo&#039;);

const response = await fetch(&#039;https://api.exemplo.com/upload&#039;, {

method: &#039;POST&#039;,

body: formData

// Note: não defina &#039;Content-Type&#039;, o navegador faz isso automaticamente

});

return response.json();

}</code></pre>

<h2>Conclusão</h2>

<p>Você aprendeu que <strong>Fetch API é a forma moderna e nativa de consumir APIs REST</strong>, eliminando a necessidade de bibliotecas externas para operações básicas. Dominar async/await e a importância de validar <code>response.ok</code> são fundamentos críticos que diferenciam código profissional de código frágil. Por fim, padrões como funções helpers e AbortController transformam requisições simples em sistemas robusto, prontos para produção.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API" target="_blank" rel="noopener noreferrer">MDN Web Docs - Fetch API</a></li>

<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch" target="_blank" rel="noopener noreferrer">MDN - Using Fetch</a></li>

<li><a href="https://eloquentjavascript.net/18_http.html" target="_blank" rel="noopener noreferrer">Eloquent JavaScript - HTTP and Forms</a></li>

<li><a href="https://web.dev/introduction-to-fetch/" target="_blank" rel="noopener noreferrer">Web.dev - Introduction to fetch()</a></li>

<li><a href="https://javascript.info/fetch" target="_blank" rel="noopener noreferrer">JavaScript.info - Fetch API</a></li>

</ul>

Comentários

Mais em JavaScript

Dominando Intl API em JavaScript: Internacionalização e Formatação de Dados em Projetos Reais
Dominando Intl API em JavaScript: Internacionalização e Formatação de Dados em Projetos Reais

O que é Intl API e Por Que Importa A Intl API é um objeto global do JavaScrip...

Guia Completo de Interfaces e Type Aliases em TypeScript na Prática
Guia Completo de Interfaces e Type Aliases em TypeScript na Prática

Fundamentos: Type Aliases vs Interfaces Type Aliases e Interfaces são dois me...

Dominando Módulos Nativos do Node.js: fs, path, os e crypto em Projetos Reais
Dominando Módulos Nativos do Node.js: fs, path, os e crypto em Projetos Reais

Introdução aos Módulos Nativos do Node.js O Node.js fornece diversos módulos...