Как отправить HTTP-запрос из React-приложения? Какие библиотеки можно использовать?

Отправка HTTP-запросов в React-приложении — ключевая часть взаимодействия с внешними API. React сам по себе не содержит встроенных средств для сетевых запросов, но ты можешь использовать как нативный fetch, так и сторонние библиотеки вроде axios, SWR, react-query и других. Запросы обычно отправляются внутри хука useEffect, useMutation, useQuery или кастомных хуков.

Способы отправки HTTP-запросов в React

1. Нативный fetch API

fetch — встроенный способ отправки HTTP-запросов в браузере. Он возвращает Promise, поэтому часто используется с async/await.

import { useEffect, useState } from "react";
function Users() {
const \[users, setUsers\] = useState(\[\]);
const \[error, setError\] = useState(null);
useEffect(() => {
async function fetchUsers() {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
if (!response.ok) throw new Error(\`Ошибка: ${response.status}\`);
const data = await response.json();
setUsers(data);
} catch (err) {
setError(err.message);
}
}
fetchUsers();
}, \[\]);
return (
<div>
{error && <p>Ошибка: {error}</p>}
{users.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}

fetch требует ручной обработки ошибок (try/catch) и ручной проверки response.ok.

2. Axios

axios — популярная библиотека для HTTP-запросов. Она удобнее fetch, особенно при работе с JSON и перехватчиками (interceptors).

Установка:

npm install axios

Пример:

import axios from 'axios';
import { useEffect, useState } from 'react';
function Users() {
const \[users, setUsers\] = useState(\[\]);
const \[error, setError\] = useState(null);
useEffect(() => {
axios.get('https://jsonplaceholder.typicode.com/users')
.then(res => setUsers(res.data))
.catch(err => setError(err.message));
}, \[\]);
return (
<div>
{error && <p>Ошибка: {error}</p>}
{users.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}

Преимущества axios:

  • Автоматически парсит JSON.

  • Поддержка interceptors (например, для токенов).

  • Удобная работа с params, headers.

  • Унифицированный API для браузера и Node.js.

Библиотеки для управления данными (data fetching + caching)

3. React Query (теперь TanStack Query)

@tanstack/react-query — мощная библиотека для управления асинхронными запросами, кешем, статусами, повторными запросами.

Установка:

npm install @tanstack/react-query

Пример:

import { useQuery } from '@tanstack/react-query';
import axios from 'axios';
function Users() {
const { data, isLoading, isError, error } = useQuery({
queryKey: \['users'\],
queryFn: async () => {
const res = await axios.get('https://jsonplaceholder.typicode.com/users');
return res.data;
},
});
if (isLoading) return <p>Загрузка...</p>;
if (isError) return <p>Ошибка: {error.message}</p>;
return (
<div>
{data.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}

Преимущества:

  • Кеширование и повторное использование данных.

  • Автоматическое обновление.

  • Работа с mutation, pagination, infinite scroll.

  • Расширенные DevTools.

4. SWR (от Vercel)

SWR (Stale While Revalidate)  легковесная альтернатива React Query от разработчиков Next.js.

Установка:

npm install swr

Пример:

import useSWR from 'swr';
import axios from 'axios';
const fetcher = url => axios.get(url).then(res => res.data);
function Users() {
const { data, error, isLoading } = useSWR('https://jsonplaceholder.typicode.com/users', fetcher);
if (isLoading) return <p>Загрузка...</p>;
if (error) return <p>Ошибка: {error.message}</p>;
return (
<div>
{data.map(user => (
<div key={user.id}>{user.name}</div>
))}
</div>
);
}

SWR автоматически кеширует данные, обновляет их в фоне, перезапрашивает при фокусе на окне и многое другое.

Дополнительные возможности

  • **POST-запрос:
    **
fetch('https://example.com/api', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alice' })
});

или с axios:

axios.post('https://example.com/api', { name: 'Alice' });
  • **Добавление токена (например, JWT):
    **
axios.defaults.headers.common\['Authorization'\] = \`Bearer ${token}\`;
  • **Отмена запроса (axios):
    **
const controller = new AbortController();
axios.get('/api', { signal: controller.signal });
// Позже:
controller.abort();
  • **Интерсепторы (axios):
    **
axios.interceptors.request.use(config => {
config.headers.Authorization = 'Bearer ' + token;
return config;
});

Где отправлять запрос

  • Внутри useEffect (для fetch и axios) при монтировании компонента.

  • Внутри событий, например onClick, onSubmit.

  • Внутри useQuery / useMutation — при использовании React Query.

  • Внутри useSWR — при использовании SWR.

Популярные библиотеки для работы с HTTP в React

Библиотека Описание
axios Популярный HTTP-клиент, удобный синтаксис, interceptors
--- ---
fetch Нативный API, поддерживается всеми браузерами
--- ---
@tanstack/react-query Мощный инструмент управления данными и кешем
--- ---
swr Лёгкий и быстрый клиент от Vercel
--- ---
ky Маленькая обёртка над fetch с приятным API
--- ---
graphql-request Для GraphQL-запросов
--- ---
apollo-client Полный стек для GraphQL в React-приложениях
--- ---

Практические советы

  • Не делай запросы напрямую в теле компонента — всегда используй хуки.

  • Отделяй логику запроса от UI — можно выносить в кастомные хуки.

  • Обрабатывай ошибки и показывай пользователю результат (isLoading, isError).

  • Избегай утечек памяти: при необходимости используй AbortController или isMounted.