REST API Naming Best Practices
Введение: таблички на дверях 🏷️
Если на дверях кабинетов написано «Кабинет 1» и «Кабинет 2», ты сразу понимаешь, куда идти.
Если на одной двери написано «Войти сюда», а на другой «Получить кабинет», начинается путаница.
В API всё так же: имена эндпоинтов — это навигация.
💡 Совет: название эндпоинта должно говорить, какой это ресурс.
✅ Вывод: понятные имена экономят время и снижают ошибки.
Проблема → решение
Проблема: адреса называются как попало, и каждый разработчик трактует их по‑своему.
Решение: вводим правила нейминга: ресурсы — это существительные, стиль единый, ID и фильтры в правильных местах.
✅ Вывод: правила превращают API в понятную карту.
Чем помогает и как работает
Нейминг помогает быстро понять, что делает эндпоинт, ещё до чтения документации.
Он снижает риск ошибок и ускоряет работу команды.
Как это работает:
- Мы выбираем один стиль и набор правил.
- Любой разработчик может «угадать» адрес по названию ресурса.
- Клиенты получают предсказуемые URL.
✅ Вывод: хороший нейминг делает API удобным и стабильным.
Ключевые термины (простыми словами)
- Resource (ресурс) — сущность, например «курс».
- Endpoint (эндпоинт) — адрес ресурса в API.
- Collection (коллекция) — список ресурсов (
/courses). - Path parameter (параметр пути) — ID в адресе (
/courses/10). - Query parameter (параметр запроса) — условия поиска (
?level=beginner). - kebab-case (кебаб‑кейс) — слова через дефис:
user-profiles. - snake_case (снэйк‑кейс) — слова через подчёркивание:
user_profiles.
Самое важное (must‑know)
- URL описывает ресурс, а действие задаёт HTTP‑метод.
- Коллекции пишем во множественном числе.
- ID всегда в пути, фильтры и сортировка — в query.
- Выбираем один стиль (kebab‑case или snake_case) и держим его везде.
- Избегаем глаголов и лишних слов в URL.
✅ Вывод: если эти правила соблюдены, API читается «с ходу».
1. Ресурсные названия — только сущности
Назначение: показать, какой объект доступен по адресу.
Простыми словами: в URL пишем «что это», а не «что сделать».
Аналогия: на двери пишут «Кабинет», а не «Зайди».
Пример:
GET /coursesPOST /courses# плохо: /getCourses, /createCourse🔎 Как это происходит на практике:
- Клиент вызывает
GET /courses. - Сервер понимает, что нужен список курсов.
- Возвращает коллекцию ресурсов.
Характеристики:
- ✅ В URL только существительные.
- ✅ Действие видно из HTTP‑метода.
- ✅ Названия читаются без подсказок.
Когда использовать: всегда, когда описываешь ресурсы API.
✅ Вывод: ресурсные имена делают API понятным.
2. Коллекции во множественном числе
Назначение: отличать список от одного объекта.
Простыми словами: много — во множественном, один — с ID.
Аналогия: «книги» и «книга №10».
Пример:
GET /coursesGET /courses/10🔎 Как это происходит на практике:
- Клиент получает список по
/courses. - Выбирает нужный ID.
- Запрашивает детали по
/courses/10.
Характеристики:
- ✅ Коллекция = множественное число.
- ✅ Объект = ID в пути.
- ✅ Структура повторяется во всех ресурсах.
Когда использовать: для всех списков и единичных объектов.
✅ Вывод: правило «коллекция + ID» снимает путаницу.
3. Единый стиль: kebab‑case или snake_case
Назначение: сделать URL визуально одинаковыми.
Простыми словами: один стиль = меньше ошибок.
Аналогия: одинаковые таблички в одном доме.
Пример:
GET /user-profiles# плохо: /userProfiles🔎 Как это происходит на практике:
- Команда выбирает стиль (например, kebab‑case).
- Все новые эндпоинты пишутся так же.
- Документация и клиенты не путаются.
Характеристики:
- ✅ Один стиль на весь проект.
- ✅ Без смешения kebab и camel.
- ✅ Легко искать и поддерживать.
Когда использовать: во всех URL без исключений.
✅ Вывод: единый стиль = единый язык API.
4. ID в пути, условия в query
Назначение: разделить «адрес» и «условия».
Простыми словами: ID — это адрес, фильтр — это настройки выдачи.
Аналогия: адрес дома и параметры поиска квартиры.
Пример:
GET /courses/10GET /courses?level=beginner&sort=rating🔎 Как это происходит на практике:
- Клиент указывает ID в пути.
- Для фильтра добавляет query‑параметры.
- Сервер применяет условия и отдаёт результат.
Характеристики:
- ✅ ID всегда в path.
- ✅ Фильтры, сортировка, пагинация — в query.
- ✅ URL остаётся логичным и читаемым.
Когда использовать: когда нужно сузить или отсортировать выдачу.
✅ Вывод: чёткое разделение делает API предсказуемым.
5. Действия — через под‑ресурсы и методы
Назначение: описать нестандартное действие без глаголов в URL.
Простыми словами: действие показываем методом или отдельным под‑ресурсом.
Аналогия: кнопка «Опубликовать» внутри карточки курса.
Пример:
POST /courses/10/publish# плохо: /publishCourse/10🔎 Как это происходит на практике:
- Клиент вызывает
POST /courses/10/publish. - Сервер запускает действие публикации.
- Возвращает результат операции.
Характеристики:
- ✅ Действия оформлены как под‑ресурсы.
- ✅ Глаголы не «лезут» в основной путь.
- ✅ Метод остаётся главным маркером действия.
Когда использовать: для операций типа publish, archive, activate.
✅ Вывод: действия остаются понятными и не ломают стиль.
6. Короткие и читаемые URL
Назначение: уменьшить шум и ошибки.
Простыми словами: чем короче адрес, тем проще его понять.
Аналогия: короткий адрес быстрее запомнить.
Пример:
GET /courses/10/lessons# плохо: /courses/10/all-lessons-for-course🔎 Как это происходит на практике:
- Команда убирает лишние слова.
- Оставляет только смысловые части.
- URL становится короче и яснее.
Характеристики:
- ✅ Нет расширений вроде .php.
- ✅ Нет «лишних» слов.
- ✅ Вложенность не глубже 1–2 уровней.
Когда использовать: всегда, особенно в публичных API.
✅ Вывод: короткие URL легче читать и поддерживать.
Сравнение хорошего и плохого нейминга
| Хорошо | Плохо | Почему |
|---|---|---|
/courses | /getCourses | действие должно быть в методе |
/courses/10 | /course?id=10 | ID должен быть в пути |
/courses?level=beginner | /courses/level/beginner | фильтр — это query |
/user-profiles | /userProfiles | один стиль на весь API |
Часто спрашивают на собеседованиях
- Почему в REST не используют глаголы в URL и где тогда «действие».
- Чем path‑параметры отличаются от query‑параметров.
- Зачем нужен единый стиль (kebab/snake) и что будет, если смешивать.
- Когда допустима вложенность и почему её ограничивают 1–2 уровнями.
- Как правильно оформлять нестандартные действия (publish, archive).
✅ Вывод: эти вопросы проверяют понимание, а не знание терминов.
Типичные ошибки
Ошибка 1: Глаголы в URL
❌ Неправильно:
✅ Правильно:
Почему: действие определяется HTTP‑методом.
/getCourses✅ Правильно:
/coursesПочему: действие определяется HTTP‑методом.
Ошибка 2: Смешение стилей
❌ Неправильно:
✅ Правильно: выбрать один стиль и держать его
Почему: смешение ломает предсказуемость.
/userProfiles рядом с /user_profiles✅ Правильно: выбрать один стиль и держать его
Почему: смешение ломает предсказуемость.
Ошибка 3: Фильтры в пути
❌ Неправильно:
✅ Правильно:
Почему: фильтры — это условия, а не адрес ресурса.
/courses/level/beginner✅ Правильно:
/courses?level=beginnerПочему: фильтры — это условия, а не адрес ресурса.
Ошибка 4: Глубокая вложенность
❌ Неправильно:
✅ Правильно: остановиться на 1–2 уровнях
Почему: слишком глубокие URL трудно читать.
/users/1/courses/2/lessons/3/tasks/4✅ Правильно: остановиться на 1–2 уровнях
Почему: слишком глубокие URL трудно читать.
Ошибка 5: Лишние слова
❌ Неправильно:
✅ Правильно:
Почему: адрес должен быть коротким.
/courses/all-available-courses✅ Правильно:
/coursesПочему: адрес должен быть коротким.
Ошибка 6: Расширения файлов
❌ Неправильно:
✅ Правильно:
Почему: API — это ресурсы, не файлы.
/courses.php✅ Правильно:
/coursesПочему: API — это ресурсы, не файлы.
Best Practices
- Используй существительные и множественное число.
- Держи единый стиль именования во всех URL.
- Разделяй ID (path) и условия (query).
- Действия оформляй через методы или под‑ресурсы.
- Ограничивай вложенность 1–2 уровнями.
- Убирай лишние слова и расширения.
Заключение
Хороший нейминг — это навигация по API.
Он помогает быстрее понимать эндпоинты и снижает ошибки.
Если правила простые и единые — API становится дружелюбным.
✅ Вывод: нейминг — это часть качества API, а не косметика.