Что такое REST API и как его использовать с React?react-84

Что такое REST API?

REST API — это архитектурный стиль для создания веб-сервисов, который использует:

  • HTTP-методы (GET, POST, PUT, DELETE)
  • Статус-коды (200 OK, 404 Not Found)
  • Ресурсо-ориентированные URL (например, /api/users)
  • JSON/XML как основные форматы данных

Основные принципы REST:

  1. Stateless (без состояния) — каждый запрос содержит всю необходимую информацию
  2. Кэшируемость — ответы могут кэшироваться
  3. Единообразие интерфейса

Подключение REST API к React

1. Нативные методы

Стандартный браузерный API для HTTP-запросов:

function fetchUsers() {
  fetch('https://api.example.com/users')
    .then(response => {
      if (!response.ok) throw new Error('Network error');
      return response.json();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
}

2. Использование хуков

Создаем переиспользуемый хук для запросов:

import { useState, useEffect } from 'react';

function useApi(endpoint) {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    fetch(endpoint)
      .then(res => res.json())
      .then(data => {
        setData(data);
        setLoading(false);
      })
      .catch(err => {
        setError(err);
        setLoading(false);
      });
  }, [endpoint]);

  return { data, loading, error };
}

// Использование:
const { data, loading, error } = useApi('/api/users');

3. Популярные библиотеки

Axios

npm install axios

Пример использования:

import axios from 'axios';

async function getUsers() {
  try {
    const response = await axios.get('/api/users');
    console.log(response.data);
  } catch (error) {
    console.error('Error:', error.response?.data);
  }
}

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

  • Автоматическая трансформация JSON
  • Перехватчики запросов/ответов (interceptors)
  • Отмена запросов
  • Защита от XSRF

4. Полный пример компонента

import React, { useState, useEffect } from 'react';
import axios from 'axios';

function UserList() {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(false);

  // GET (получение данных)
  useEffect(() => {
    const fetchUsers = async () => {
      setLoading(true);
      try {
        const { data } = await axios.get('/api/users');
        setUsers(data);
      } catch (error) {
        console.error('Fetch error:', error);
      } finally {
        setLoading(false);
      }
    };

    fetchUsers();
  }, []);

  // POST (создание)
  const addUser = async (user) => {
    try {
      const { data } = await axios.post('/api/users', user);
      setUsers(prev => [...prev, data]);
    } catch (error) {
      console.error('Create error:', error);
    }
  };

  // DELETE (удаление)
  const deleteUser = async (id) => {
    try {
      await axios.delete(`/api/users/${id}`);
      setUsers(prev => prev.filter(user => user.id !== id));
    } catch (error) {
      console.error('Delete error:', error);
    }
  };

  if (loading) return <div>Loading...</div>;

  return (
    <div>
      {users.map(user => (
        <div key={user.id}>
          {user.name}
          <button onClick={() => deleteUser(user.id)}>Delete</button>
        </div>
      ))}
    </div>
  );
}

Лучшие практики

  1. Разделение логики — выносите API-вызовы в отдельные сервисы
  2. Обработка ошибок — унифицированная система обработки
  3. Индикация загрузки — показывать состояние загрузки
  4. Оптимизация — кэширование, отмена дублирующих запросов
  5. Безопасность — валидация данных, защита от XSS

Альтернативы REST в React

  • GraphQL (Apollo Client, Relay)
  • WebSockets для real-time данных
  • React Query (для управления состоянием API-запросов)

Резюмируем

REST API — стандартный способ взаимодействия с сервером в React-приложениях. Для работы с ним можно использовать как нативные браузерные API (fetch), так и библиотеки типа Axios. Ключевые аспекты — правильная обработка состояний загрузки и ошибок, разделение логики и соблюдение REST-принципов.