React Front-end Инженер

React Front-end Инженер

Роадмап навыков для прокачки

Что такое REST

Практики разработки ПОСетевые технологииREST

Основная идея

REST (Representational State Transfer) — это архитектурный стиль для построения веб-сервисов, основанный на работе с ресурсами через стандартные HTTP-методы. REST делает API предсказуемым, масштабируемым и простым для понимания.

Ключевые аспекты

  • Ресурсы — всё является ресурсом (пользователи, товары, заказы), каждый идентифицируется уникальным URI
  • HTTP-методы — GET (чтение), POST (создание), PUT/PATCH (обновление), DELETE (удаление)
  • Stateless — сервер не хранит состояние клиента между запросами
  • Единый интерфейс — стандартизированный способ взаимодействия с ресурсами
  • Кэшируемость — ответы могут кэшироваться для повышения производительности

Плюсы REST

  • Простота понимания и использования
  • Масштабируемость благодаря stateless-архитектуре
  • Хорошая совместимость с HTTP-инфраструктурой (кэши, прокси)
  • Независимость клиента и сервера

Минусы REST

  • Избыточность данных (over-fetching/under-fetching)
  • Нет встроенной типизации контракта
  • Сложность версионирования API

Частые ошибки на собеседованиях

  • Путают REST с конкретным форматом данных (JSON) — REST не привязан к формату
  • Считают, что любой HTTP API — это REST (REST требует соблюдения ограничений)
  • Забывают о семантике HTTP-методов и статус-кодов
  • Не понимают разницу между PUT (полная замена) и PATCH (частичное обновление)

Введение и проблематика

REST (Representational State Transfer) — это архитектурный стиль для построения распределённых систем, предложенный Роем Филдингом в 2000 году в его докторской диссертации. REST определяет набор ограничений, которые делают веб-сервисы масштабируемыми, надёжными и простыми для понимания.

REST — это не протокол и не стандарт, а архитектурный стиль. Он описывает принципы проектирования, а не конкретную реализацию.

Какую проблему решает REST?

До появления REST веб-сервисы строились по разным принципам, что приводило к проблемам:

  • Сложность интеграции — каждый сервис имел уникальный интерфейс
  • Низкая масштабируемость — серверы хранили состояние клиентов
  • Отсутствие стандартов — разработчикам приходилось изучать каждый API с нуля

REST предложил унифицированный подход, основанный на уже существующих стандартах HTTP.


Базовая теория

Ресурсы — основа REST

В REST всё является ресурсом. Ресурс — это любая именованная сущность: пользователь, товар, заказ, статья. Каждый ресурс идентифицируется уникальным URI (Uniform Resource Identifier).

text
/users           — коллекция пользователей
/users/123       — конкретный пользователь с id=123
/users/123/orders — заказы пользователя 123
/products        — коллекция товаров
/products/456    — конкретный товар

6 ограничений REST

REST определяет шесть архитектурных ограничений:

ОграничениеОписание
Client-ServerКлиент и сервер разделены, развиваются независимо
StatelessКаждый запрос содержит всю информацию для обработки
CacheableОтветы должны помечаться как кэшируемые или нет
Uniform InterfaceЕдиный интерфейс для всех ресурсов
Layered SystemАрхитектура может состоять из слоёв
Code on Demand(опционально) Сервер может передавать исполняемый код
⚠️

Самое важное ограничение — Stateless. Сервер не хранит состояние клиента между запросами. Вся необходимая информация (токен авторизации, параметры) передаётся в каждом запросе.

HTTP-методы в REST

REST использует стандартные HTTP-методы для операций над ресурсами:

МетодОперацияИдемпотентностьБезопасность
GETЧтениеДаДа
POSTСозданиеНетНет
PUTПолная заменаДаНет
PATCHЧастичное обновлениеНетНет
DELETEУдалениеДаНет

Идемпотентность — повторный запрос даёт тот же результат. Безопасность — запрос не изменяет состояние сервера.


Практические примеры

CRUD операции через REST API

Получение списка пользователей (GET)

http
GET /api/users HTTP/1.1
Host: example.com
Authorization: Bearer token123

Ответ (200 OK):

json
{
  "data": [
    { "id": 1, "name": "Иван", "email": "ivan@mail.ru" },
    { "id": 2, "name": "Мария", "email": "maria@mail.ru" }
  ],
  "total": 2
}

Создание пользователя (POST)

http
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer token123
 
{
  "name": "Алексей",
  "email": "alexey@mail.ru"
}

Ответ (201 Created):

json
{
  "id": 3,
  "name": "Алексей",
  "email": "alexey@mail.ru"
}

Обновление пользователя (PUT)

http
PUT /api/users/3 HTTP/1.1
Host: example.com
Content-Type: application/json
 
{
  "name": "Алексей Петров",
  "email": "alexey.petrov@mail.ru"
}

Ответ (200 OK):

json
{
  "id": 3,
  "name": "Алексей Петров",
  "email": "alexey.petrov@mail.ru"
}

Удаление пользователя (DELETE)

http
DELETE /api/users/3 HTTP/1.1
Host: example.com
Authorization: Bearer token123

Ответ: 204 No Content

Пример на JavaScript (fetch)

js
// Получение списка пользователей
const response = await fetch('/api/users', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer token123'
  }
});
 
const users = await response.json();
console.log(users);

Пограничные кейсы

⚠️

Частая ошибка: использование глаголов в URL

text
❌ GET  /getUsers
❌ POST /createUser
❌ POST /deleteUser/123

✅ GET    /users
✅ POST   /users
✅ DELETE /users/123

Действие определяется HTTP-методом, а не URL.

🚫

Антипаттерн: игнорирование HTTP статус-кодов

js
// ❌ Неправильно — всегда 200, ошибка в теле
{
  "status": 200,
  "success": false,
  "error": "User not found"
}
 
// ✅ Правильно — используем HTTP статус-коды
// 404 Not Found
{
  "error": "User not found"
}

Основные HTTP статус-коды

КодЗначениеКогда использовать
200OKУспешный GET, PUT, PATCH
201CreatedУспешный POST (создание)
204No ContentУспешный DELETE
400Bad RequestНевалидные данные
401UnauthorizedНет авторизации
403ForbiddenНет прав доступа
404Not FoundРесурс не найден
500Internal Server ErrorОшибка сервера

Продвинутые аспекты

Richardson Maturity Model

Модель зрелости REST API по Леонарду Ричардсону:

УровеньОписаниеПример
Level 0Один URL, один методPOST /api
Level 1Разные URL для ресурсовPOST /users, POST /orders
Level 2HTTP-методы по назначениюGET /users, POST /users
Level 3HATEOAS (гиперссылки)Ответ содержит ссылки на связанные ресурсы

Большинство production API находятся на уровне 2. Уровень 3 (HATEOAS) реализуется редко из-за сложности.

Версионирование API

text
GET /api/v1/users
GET /api/v2/users

Самый распространённый подход.


Плюсы и минусы

АспектПлюсыМинусы
ПростотаИспользует стандартный HTTPМожет быть избыточным для простых случаев
МасштабируемостьStateless позволяет горизонтальное масштабирование
КэшированиеВстроенная поддержка HTTP-кэшированияСложно кэшировать POST-запросы
Гибкость данныхНе привязан к формату (JSON, XML)Over-fetching / Under-fetching
СвязностьСлабая связанность клиента и сервераНет строгой типизации контракта

REST vs GraphQL vs gRPC

КритерийRESTGraphQLgRPC
ФорматJSON/XMLJSONProtobuf
ТранспортHTTPHTTPHTTP/2
ТипизацияНетСхемаСтрогая
Over-fetchingДаНетНет
КэшированиеПростоСложноСложно
Кривая обученияНизкаяСредняяВысокая

Вопросы интервьюера

Q: Что такое REST и чем он отличается от SOAP?

REST — архитектурный стиль, SOAP — протокол. REST использует стандартный HTTP, легче и гибче. SOAP требует XML и имеет строгую спецификацию (WSDL).

Q: Что означает Stateless в REST?

Сервер не хранит состояние клиента между запросами. Каждый запрос должен содержать всю информацию для обработки (токен, параметры). Это позволяет легко масштабировать систему.

Q: В чём разница между PUT и PATCH?

PUT заменяет ресурс целиком (нужно передать все поля), PATCH обновляет только указанные поля. PUT идемпотентен, PATCH — нет.

Q: Что такое идемпотентность?

Свойство операции давать одинаковый результат при многократном выполнении. GET, PUT, DELETE — идемпотентны. POST — нет (каждый вызов создаёт новый ресурс).

Q: Как обрабатывать ошибки в REST API?

Использовать соответствующие HTTP статус-коды (400, 401, 404, 500) и возвращать структурированное тело ошибки с описанием проблемы.


Источники