JavaScript

O que Todo Dev Deve Saber sobre Consumo de APIs em React: Fetch, Axios e React Query

9 min de leitura

O que Todo Dev Deve Saber sobre Consumo de APIs em React: Fetch, Axios e React Query

Entendendo APIs e a Necessidade do Consumo em React Uma API (Application Programming Interface) é um contrato entre sistemas que permite a comunicação estruturada. Em aplicações React modernas, consumir APIs é essencial para recuperar dados de servidores, atualizar informações e manter sua aplicação sincronizada com o backend. Sem esse mecanismo, sua interface teria apenas dados estáticos. A diferença fundamental entre as três abordagens que estudaremos está no nível de abstração: o Fetch é nativo do navegador e básico, o Axios oferece funcionalidades aprimoradas prontas para uso, e o React Query gerencia o estado da requisição de forma inteligente, cacheando dados e sincronizando automaticamente. Fetch API: O Padrão Nativo do Navegador O Fetch é a API padrão JavaScript para requisições HTTP. É nativa, não requer instalação e funciona bem em projetos simples. Sintaxe Básica e Exemplos Limitações Práticas Embora funcional, Fetch exige muito código boilerplate para tratamento de estados. Para POST com headers customizados, a verbosidade aumenta. Além disso, não há

<h2>Entendendo APIs e a Necessidade do Consumo em React</h2>

<p>Uma API (Application Programming Interface) é um contrato entre sistemas que permite a comunicação estruturada. Em aplicações React modernas, consumir APIs é essencial para recuperar dados de servidores, atualizar informações e manter sua aplicação sincronizada com o backend. Sem esse mecanismo, sua interface teria apenas dados estáticos.</p>

<p>A diferença fundamental entre as três abordagens que estudaremos está no nível de abstração: o Fetch é nativo do navegador e básico, o Axios oferece funcionalidades aprimoradas prontas para uso, e o React Query gerencia o estado da requisição de forma inteligente, cacheando dados e sincronizando automaticamente.</p>

<h2>Fetch API: O Padrão Nativo do Navegador</h2>

<p>O Fetch é a API padrão JavaScript para requisições HTTP. É nativa, não requer instalação e funciona bem em projetos simples.</p>

<h3>Sintaxe Básica e Exemplos</h3>

<pre><code class="language-javascript">import { useEffect, useState } from &#039;react&#039;;

function UsersList() {

const [users, setUsers] = useState([]);

const [loading, setLoading] = useState(true);

const [error, setError] = useState(null);

useEffect(() =&gt; {

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

.then(response =&gt; {

if (!response.ok) throw new Error(&#039;Erro na resposta&#039;);

return response.json();

})

.then(data =&gt; {

setUsers(data);

setLoading(false);

})

.catch(err =&gt; {

setError(err.message);

setLoading(false);

});

}, []);

if (loading) return &lt;p&gt;Carregando...&lt;/p&gt;;

if (error) return &lt;p&gt;Erro: {error}&lt;/p&gt;;

return (

&lt;ul&gt;

{users.map(user =&gt; (

&lt;li key={user.id}&gt;{user.name}&lt;/li&gt;

))}

&lt;/ul&gt;

);

}

export default UsersList;</code></pre>

<h3>Limitações Práticas</h3>

<p>Embora funcional, Fetch exige muito código boilerplate para tratamento de estados. Para POST com headers customizados, a verbosidade aumenta. Além disso, não há retry automático, interceptadores ou cancelamento de requisições de forma elegante. Para projetos grandes, essas deficiências se tornam problemas.</p>

<h2>Axios: Simplicidade e Recursos Aprimorados</h2>

<p>Axios é uma biblioteca HTTP que abstrai Fetch com uma API mais limpa. Oferece interceptadores, transformação automática de dados e cancelamento de requisições nativamente.</p>

<h3>Instalação e Uso Direto</h3>

<pre><code class="language-bash">npm install axios</code></pre>

<pre><code class="language-javascript">import axios from &#039;axios&#039;;

import { useEffect, useState } from &#039;react&#039;;

function UsersList() {

const [users, setUsers] = useState([]);

const [loading, setLoading] = useState(true);

const [error, setError] = useState(null);

useEffect(() =&gt; {

const controller = new AbortController();

axios

.get(&#039;https://jsonplaceholder.typicode.com/users&#039;, {

signal: controller.signal,

})

.then(response =&gt; {

setUsers(response.data);

setLoading(false);

})

.catch(err =&gt; {

if (err.name !== &#039;CanceledError&#039;) {

setError(err.message);

}

setLoading(false);

});

return () =&gt; controller.abort();

}, []);

if (loading) return &lt;p&gt;Carregando...&lt;/p&gt;;

if (error) return &lt;p&gt;Erro: {error}&lt;/p&gt;;

return (

&lt;ul&gt;

{users.map(user =&gt; (

&lt;li key={user.id}&gt;{user.name}&lt;/li&gt;

))}

&lt;/ul&gt;

);

}

export default UsersList;</code></pre>

<h3>Interceptadores para Autenticação</h3>

<pre><code class="language-javascript">const api = axios.create({

baseURL: &#039;https://api.exemplo.com&#039;,

});

api.interceptors.request.use(config =&gt; {

const token = localStorage.getItem(&#039;token&#039;);

if (token) {

config.headers.Authorization = Bearer ${token};

}

return config;

});

api.interceptors.response.use(

response =&gt; response,

error =&gt; {

if (error.response?.status === 401) {

localStorage.removeItem(&#039;token&#039;);

window.location.href = &#039;/login&#039;;

}

return Promise.reject(error);

}

);</code></pre>

<p>Axios simplifica requisições e oferece recursos prontos, mas você ainda gerencia manualmente estado de loading, cache e sincronização.</p>

<h2>React Query: Gerenciamento Inteligente de Dados Remotos</h2>

<p>React Query (agora TanStack Query) é uma biblioteca que abstrai a complexidade de cache, sincronização e atualização de dados de API. Ela transforma consumo de dados remotos em uma operação declarativa.</p>

<h3>Instalação e Configuração</h3>

<pre><code class="language-bash">npm install @tanstack/react-query</code></pre>

<pre><code class="language-javascript">import { QueryClient, QueryClientProvider } from &#039;@tanstack/react-query&#039;;

const queryClient = new QueryClient();

function App() {

return (

&lt;QueryClientProvider client={queryClient}&gt;

&lt;YourComponents /&gt;

&lt;/QueryClientProvider&gt;

);

}</code></pre>

<h3>Hook useQuery para Leitura</h3>

<pre><code class="language-javascript">import { useQuery } from &#039;@tanstack/react-query&#039;;

import axios from &#039;axios&#039;;

function UsersList() {

const { data: users, isLoading, error } = useQuery({

queryKey: [&#039;users&#039;],

queryFn: async () =&gt; {

const response = await axios.get(

&#039;https://jsonplaceholder.typicode.com/users&#039;

);

return response.data;

},

staleTime: 5 60 1000, // Cache válido por 5 minutos

});

if (isLoading) return &lt;p&gt;Carregando...&lt;/p&gt;;

if (error) return &lt;p&gt;Erro: {error.message}&lt;/p&gt;;

return (

&lt;ul&gt;

{users.map(user =&gt; (

&lt;li key={user.id}&gt;{user.name}&lt;/li&gt;

))}

&lt;/ul&gt;

);

}

export default UsersList;</code></pre>

<h3>Hook useMutation para Criação/Atualização</h3>

<pre><code class="language-javascript">import { useMutation, useQueryClient } from &#039;@tanstack/react-query&#039;;

function CreateUser() {

const queryClient = useQueryClient();

const mutation = useMutation({

mutationFn: async (newUser) =&gt; {

const response = await axios.post(

&#039;https://jsonplaceholder.typicode.com/users&#039;,

newUser

);

return response.data;

},

onSuccess: () =&gt; {

// Invalida cache para refetch automático

queryClient.invalidateQueries({ queryKey: [&#039;users&#039;] });

},

});

const handleCreate = () =&gt; {

mutation.mutate({ name: &#039;João&#039;, email: &#039;joao@email.com&#039; });

};

return (

&lt;div&gt;

&lt;button onClick={handleCreate} disabled={mutation.isPending}&gt;

{mutation.isPending ? &#039;Criando...&#039; : &#039;Criar Usuário&#039;}

&lt;/button&gt;

{mutation.error &amp;&amp; &lt;p&gt;Erro: {mutation.error.message}&lt;/p&gt;}

&lt;/div&gt;

);

}</code></pre>

<p>React Query elimina 80% do código boilerplate de gerenciamento de estado remoto, oferece sincronização automática, retry inteligente e cache sofisticado. Para aplicações profissionais, é o padrão ouro.</p>

<h2>Comparação Prática e Quando Usar</h2>

<div class="table-wrap"><table><thead><tr><th>Aspecto</th><th>Fetch</th><th>Axios</th><th>React Query</th></tr></thead><tbody><tr><td>Curva de Aprendizado</td><td>Baixa</td><td>Média</td><td>Média-Alta</td></tr><tr><td>Boilerplate</td><td>Alto</td><td>Médio</td><td>Baixo</td></tr><tr><td>Cache Automático</td><td>Não</td><td>Não</td><td>Sim</td></tr><tr><td>Retry Automático</td><td>Não</td><td>Sim</td><td>Sim</td></tr><tr><td>Melhor para</td><td>Projetos Simples</td><td>APIs Rápidas</td><td>Aplicações Complexas</td></tr></tbody></table></div>

<p>Use <strong>Fetch</strong> apenas em protótipos ou aplicações muito simples. Escolha <strong>Axios</strong> se você precisa de simplicidade sem adicionar dependências pesadas. Opte por <strong>React Query</strong> em projetos com múltiplas requisições, sincronização de dados em tempo real ou quando o cache inteligente agregue valor significativo.</p>

<h2>Conclusão</h2>

<p>Aprendemos que o <strong>Fetch é suficiente para casos triviais, mas gera código repetitivo</strong>. O <strong>Axios resolve a verbosidade com uma API intuitiva e interceptadores</strong>, sendo excelente para a maioria dos projetos. O <strong>React Query revoluciona o gerenciamento de dados remotos</strong>, automatizando cache, sincronização e atualização — esse é o futuro do desenvolvimento React profissional.</p>

<p>Seu próximo passo é escolher a ferramenta adequada ao escopo do projeto e dominar sua API completamente. Comece com Axios em um projeto real, depois migre para React Query quando sentir a necessidade de cache e sincronização inteligentes.</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://axios-http.com/docs/intro" target="_blank" rel="noopener noreferrer">Documentação Oficial Axios</a></li>

<li><a href="https://tanstack.com/query/latest" target="_blank" rel="noopener noreferrer">TanStack Query - React Query</a></li>

<li><a href="https://react.dev/learn/synchronizing-with-effects" target="_blank" rel="noopener noreferrer">React Docs - Data Fetching</a></li>

<li><a href="https://blog.logrocket.com/react-hooks-fetching-data/" target="_blank" rel="noopener noreferrer">How to fetch data with React Hooks - LogRocket</a></li>

</ul>

Comentários

Mais em JavaScript

Laços em JavaScript: for, while, for...of, for...in e forEach: Do Básico ao Avançado
Laços em JavaScript: for, while, for...of, for...in e forEach: Do Básico ao Avançado

Introdução aos Laços em JavaScript Laços são estruturas fundamentais que perm...

Guia Completo de TypeScript com Node.js e Express: APIs Tipadas do Zero
Guia Completo de TypeScript com Node.js e Express: APIs Tipadas do Zero

Configuração Inicial do Ambiente Antes de iniciar qualquer projeto com TypeSc...

Como Usar Classes em JavaScript: Sintaxe, Herança e Encapsulamento em Produção
Como Usar Classes em JavaScript: Sintaxe, Herança e Encapsulamento em Produção

Fundamentos de Classes em JavaScript Classes em JavaScript são açúcar sintáti...