← Назад к вопросам

Какие знаешь особенности RESTful API?

2.0 Middle🔥 221 комментариев
#API и интеграции#Форматы данных и протоколы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Особенности RESTful API

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

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

1. Client-Server архитектура

Участ должен быть четкое разделение между клиентом и сервером:

  • Client — инициирует запросы, отправляет данные
  • Server — обрабатывает запросы, возвращает ответы
  • Они развиваются независимо друг от друга

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

  • Слабая связанность (loose coupling)
  • Каждая сторона может масштабироваться независимо
  • Легче тестировать

2. Statelessness (Отсутствие состояния)

Каждый запрос содержит ВСЮ информацию, необходимую серверу для обработки. Сервер не хранит информацию о состоянии клиента между запросами.

Пример:

Запрос 1: GET /api/v1/users/123 (с token в header)
Сервер: "Вот данные пользователя 123"

Запрос 2: GET /api/v1/users/123 (с token в header)
Сервер: "Даю те же данные, т.к. не помню о запросе 1"

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

  • Масштабируемость: любой сервер в кластере может обработать запрос
  • Надежность: нет зависимости от session storage
  • Простота: не нужно синхронизировать состояние

Что не следует делать:

  • ❌ Хранить данные клиента в сессии на сервере
  • ✅ Отправлять JWT token с каждым запросом

3. Uniform Interface (Единообразный интерфейс)

Все ресурсы работают по одинаковым правилам:

Resource Identification in Requests (идентификация ресурсов в URL):

GET /api/v1/users/123
GET /api/v1/products/456
GET /api/v1/orders/789

Каждый ресурс имеет уникальный URI

Resource Manipulation Through Representations (манипуляция представлениями):

Клиент получает представление ресурса (JSON, XML)
Используя это представление, может изменить ресурс на сервере

Пример:
GET /api/v1/users/123 → возвращает JSON
ClientPUT /api/v1/users/123 → отправляет обновленный JSON

Self-Descriptive Messages (самоописывающиеся сообщения):

Каждое сообщение содержит достаточно информации для обработки:
- HTTP method (GET, POST, PUT, DELETE)
- Content-Type (application/json)
- Статус код (200, 404, 500)
- Заголовки (Authorization, Accept)

HATEOAS (Hypermedia As The Engine Of Application State):

{
  "id": 1,
  "name": "Alice",
  "email": "alice@example.com",
  "_links": {
    "self": { "href": "/api/v1/users/1" },
    "orders": { "href": "/api/v1/users/1/orders" },
    "profile": { "href": "/api/v1/users/1/profile" }
  }
}

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

4. Cacheability (Кэшируемость)

Ответы должны быть явно отмечены как кэшируемые или не кэшируемые:

HTTP/1.1 200 OK
Cache-Control: max-age=3600  (кэш на 1 час)
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT

В следующий раз клиент может использовать кэшированный ответ,
не обращаясь к серверу

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

  • Снижение нагрузки на сервер
  • Быстрее для клиента
  • Меньше трафика

5. Layered System Architecture (Слоистая архитектура)

Клиент не знает, обращается ли он к конечному серверу или к промежуточному.

Клиент
   ↓
Load Balancer (знает, куда отправить)
   ↓
API Gateway (аутентификация, логирование)
   ↓
Microservice 1 (обработка)
   ↓
Database (хранилище)

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

  • Масштабируемость
  • Улучшенная безопасность (промежуточные слои могут фильтровать)
  • Логирование и мониторинг в разных слоях

HTTP Методы в REST

Безопасные методы (не изменяют состояние сервера):

GET /api/v1/users/123
HEAD /api/v1/users/123
OPTIONS /api/v1/users

Идемпотентные методы (повторное выполнение = первое выполнение):

PUT /api/v1/users/123 (замена целиком)
DELETE /api/v1/users/123 (удаление)
GET /api/v1/users/123 (получение)

Таблица HTTP методов:

МетодЦельБезопасенИдемпотентенПример
GETПолучитьДаДаGET /users/1
POSTСоздатьНетНетPOST /users
PUTПолностью заменитьНетДаPUT /users/1
PATCHЧастично обновитьНетНетPATCH /users/1
DELETEУдалитьНетДаDELETE /users/1
HEADПроверить наличиеДаДаHEAD /users/1

Статус коды REST API

2xx Success (Успех)

200 OK — запрос успешен, возвращены данные
201 Created — ресурс создан
202 Accepted — запрос принят, но обработка идет
204 No Content — успех, но нет данных для возврата (обычно DELETE)

3xx Redirection (Перенаправление)

301 Moved Permanently — ресурс перемещен навсегда
304 Not Modified — кэшированный ответ все еще валидный
307 Temporary Redirect — временное перенаправление

4xx Client Error (Ошибка клиента)

400 Bad Request — неправильный запрос
401 Unauthorized — требуется аутентификация
403 Forbidden — доступ запрещен
404 Not Found — ресурс не найден
409 Conflict — конфликт (например, дублирующееся имя)
422 Unprocessable Entity — синтаксис верный, но логика ошибка
429 Too Many Requests — rate limit

5xx Server Error (Ошибка сервера)

500 Internal Server Error — общая ошибка
502 Bad Gateway — проблема с gateway
503 Service Unavailable — сервис недоступен

URL структура в REST

Существительные, не глаголы:

❌ GET /api/v1/getUsers
❌ POST /api/v1/createUser
✅ GET /api/v1/users
✅ POST /api/v1/users

Метод уже указывает на действие (GET = получить, POST = создать)

Иерархия ресурсов:

GET /api/v1/users                    (все пользователи)
GET /api/v1/users/123                (пользователь 123)
GET /api/v1/users/123/orders         (заказы пользователя 123)
GET /api/v1/users/123/orders/456     (заказ 456 пользователя 123)

Query параметры для фильтрации:

GET /api/v1/orders?status=completed&year=2026
GET /api/v1/users?limit=10&offset=20&sort=name
GET /api/v1/products?category=electronics&min_price=100&max_price=1000

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

URL версионирование (рекомендуется для REST):

GET /api/v1/users
GET /api/v2/users
GET /api/v3/users

Header версионирование:

GET /api/users
Accept: application/vnd.api+json;version=2

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

  • Обратная совместимость
  • Плавная миграция старых клиентов
  • Разные версии могут иметь разную логику

Примеры RESTful операций

CRUD операции:

CREATE (Create):
POST /api/v1/users
Body: {"name": "Alice", "email": "alice@example.com"}
Response: 201 Created + {"id": 123, "name": "Alice", ...}

READ (Read):
GET /api/v1/users/123
Response: 200 OK + {"id": 123, "name": "Alice", ...}

UPDATE (Update):
PUT /api/v1/users/123
Body: {"name": "Alice", "email": "newemail@example.com", ...}
Response: 200 OK + обновленные данные

DELETE (Delete):
DELETE /api/v1/users/123
Response: 204 No Content

Best Practices

1. Дизайн

  • Используй существительные для ресурсов
  • Используй HTTP методы для действий
  • Коллекции во множественном числе: /users, /orders
  • Без trailing slash: /users/123 (не /users/123/)

2. Безопасность

  • Используй HTTPS (не HTTP)
  • Аутентификация через tokens (JWT)
  • Валидируй все входные данные
  • Используй CORS если нужно

3. Производительность

  • Кэширование через Cache-Control headers
  • Pagination для больших коллекций
  • Filtering и sorting через query params
  • Compression (gzip)

4. Документация

  • OpenAPI / Swagger спецификация
  • Примеры запросов и ответов
  • Описание статус кодов
  • Рейт лимиты

5. Обработка ошибок

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid email format",
    "details": [
      {"field": "email", "message": "Email must contain @"}
    ]
  }
}

RESTful API — это не просто набор правил, а философия разработки веб-сервисов, которая обеспечивает масштабируемость, простоту и стандартизацию.

Какие знаешь особенности RESTful API? | PrepBro