Перейти к основному содержимому

Советы по проектированию REST API

1. Множественное число для коллекций​

✅

GET /products
GET /products/{product_id}

❌

GET /product/{product_id}

2. Не используйте глаголы в URL ресурсов​

Использовать HTTP методы для описания операций.

❌


POST /updateuser/{userId} или GET /getusers

✅

PUT /user/{userId}

3. Не добавлять лишние сегменты в путь​

✅

GET /v3/application/listings/{listing_id}

❌

PATCH /v3/application/shops/{shop_id}/listings/{listing_id}

Не пытаться отразить всю модель данных в URL. Если listing_id уникален — shop_id не нужен.

Исключение — если ключ действительно составной:

GET /listings/{listing_id}/options/{option_id}

4. Не добавлять расширения в URL​

❌

GET /users.json 

Формат передачи должен определяться через HTTP-заголовки (например, Accept) , не через URL.
✅

GET /users

и HTTP-заголовки настройка заголовков:

Accept: application/json

5. Не возвращать массивы верхнего уровня​

Объект позволяет легко добавить пагинацию и дополнительные поля без поломки обратной совместимости

❌

[{"id":1}, {"id":2}]

✅

{ "data": [{"id":1}, {"id":2}] }

6. Строки для идентификаторов​

Строки гибче: можно объединять, версионировать и переносить данные между базами без конфликтов.
❌

  { "id": 123 }  

✅

 { "id": "123" }  

7. Добавлять префиксы к ID​

Помогает отличать типы сущностей и уменьшает путаницу при поддержке Примеры:

Stripe: in_1MVpWEJVZPfyS2HyRgVDkwiZ
Shopify: gid://shopify/FulfillmentOrder/1469358604360

8. Не использовать 404 для "не найдено"​

❌

  • 404 Not Found может означать сетевую ошибку или неверный URL
  • Может быть возвращен прокси, балансировщиком нагрузки и т.д.
  • Не позволяет клиенту отличить "ресурс не существует" от "ошибка конфигурации"

✅
Использовать, например, 410 Gone — сервер понял запрос, но объекта нет.
Особенно важно в распределённых системах с повторными операциями (retry)

9. Последовательность​

Одинаковые поля для одинаковых сущностей во всех частях API.
✅ Единообразие в названиях и структуре полей для схожих объектов (например, Address)
❌ Несоответствия полей (country, country_name, country_code) создают путаницу и ошибки

10. Ошибки в структурированном формате​

Позволяет передавать цепочку ошибок и упрощает отладку.
✅

{
"message": "Access denied",
"type": "Unauthorized",
"types": ["Unauthorized", "Security"],
"cause": { ... }
}

11. Идемпотентность операций​

Идемпотентность = повтор вызова не меняет результат

✅

  • GET, PUT, DELETE — по определению идемпотентны
  • Для POST добавлять идемпотентный ключ: клиент отправляет уникальный ключ в заголовке или теле, а сервер проверяет его уникальность
POST /orders
Idempotency-Key: abc123

Если запрос повторится — сервер вернёт 409 CONFLICT и ID уже созданного ресурса:

{ "message": "Duplicate", "old_id": "ORD123" }

Клиент уверен, что заказ не задублировался

12. ISO8601 для даты и времени​

А также использовать ISO8601 для интервалов и длительностей.
✅ 2023-12-21T11:17:12.34Z
❌ 1703157432340

  • ISO8601 человеко-читаем
  • поддерживается всеми библиотеками
  • работает в UTC

❌Не доверять форматам по умолчанию в языке программирования.
✅ Явно использовать функции для генерации ISO 8601 (например, Date.toISOString() в JavaScript)

13. Не возвращать структуры-словари (map)​

Словари ломают совместимость и неудобны для типизированных языков.

Исключение — простые пары ключ: значение(например, metadata).

✅

{ "data": [{ "id":"KEY1" }, { "id":"KEY2" }] }

❌

{ "KEY1": {...}, "KEY2": {...} }

Материалы​

  1. How to (and how not to) design REST APIs (исходная статья, en)
  2. Идемпотентность в распределённых системах
  3. [12 неочевидных правил проектирования REST API] (https://habr.com/ru/companies/redmadrobot/articles/719222/)
  4. Лучшие практики разработки REST API: 20 советов
  5. [Шпаргалка по проектированию REST API] (https://habr.com/ru/articles/947410/)
  6. 15 важнейших рекомендаций по проектированию REST API
  7. Как разработать идеальный Web API: советы и ошибки на этом пути

Видео​

  1. Как спроектировать хороший api: 20 лучших практик
  2. Как спроектировать REST API
  3. Как писать REST API — 9 правил

Книги​

  1. Паттерны проектирования API - Джей Гивакс
  2. Проектирование веб-API - Арно Лоре