Какие правила именования в REST API ты знаешь?

Ответ

Следование общепринятым правилам именования делает REST API интуитивно понятным и предсказуемым для потребителей.

Ключевые принципы:

  1. Ресурсы — существительные, а не глаголы.

    • Хорошо: /users, /orders
    • Плохо: /getUsers, /createOrder
    • Почему: Глаголы уже заложены в HTTP-методах (GET, POST и т.д.).
  2. Используйте множественное число для коллекций.

    • Хорошо: /products
    • Плохо: /product (если это коллекция)
    • Почему: Указывает, что эндпоинт возвращает список ресурсов.
  3. Выражайте иерархию через слэш (/).

    • Пример: /users/{userId}/orders — получить заказы конкретного пользователя.
    • Почему: Четко показывает отношение «ресурс в ресурсе».
  4. Используйте query-параметры для фильтрации, сортировки и пагинации.

    • Пример: GET /products?category=electronics&sort=price&page=2&limit=20
    • Почему: Параметры запроса не являются частью пути к ресурсу и предназначены для его модификации.
  5. Используйте kebab-case (через дефис) в URL.

    • Хорошо: /user-roles
    • Плохо: /userRoles (camelCase) или /user_roles (snake_case)
    • Почему: Дефисы улучшают читаемость в браузерах и соответствуют стилю, принятому для доменов.
  6. Действия определяются HTTP-методами.

    • GET /users — получить список пользователей.
    • POST /users — создать нового пользователя.
    • PUT /users/{id} — полностью обновить пользователя.
    • PATCH /users/{id} — частично обновить пользователя.
    • DELETE /users/{id} — удалить пользователя.

Сравнение на практике:

# Несогласованный, не-RESTful подход
GET /getUserOrders?userId=123

# RESTful подход
GET /users/123/orders

Второй вариант явно указывает на ресурс «заказы», вложенный в ресурс «пользователь с id=123», и использует стандартный HTTP-метод для операции получения.

Ответ 18+ 🔞

А, ну вот, опять про эти ваши REST API правила начинают. Слушай, а ведь реально, если их не соблюдать, получается такая каша, что потом сам чёрт ногу сломит, пытаясь понять, что этот эндпоинт делает. Прям как в том анекдоте про Герасима — хотел сказать, а нихуя не может, только «Му-му».

Вот смотри, главная фишка — ресурсы это у тебя существительные, а не глаголы. Это как в магазин прийти и сказать: «Мне операция-получения-хлеба». Тебя там пошлют нахуй, и правильно сделают. Ты просто говоришь: «Хлеба». Так и тут.

  • Нормально: /users, /orders — вот они, предметы, с которыми работаем.
  • Полный пиздец: /getUsers, /createOrder — это уже не ресурс, а инструкция. Глаголы-то куда девать? Они уже есть — это HTTP-методы! GET — получить, POST — создать. Зачем одно и то же два раза называть? Умножение сущностей, блядь.

И ещё, коллекции — это множественное число. GET /products. Это же логично, ёпта! Приходишь на склад — там продукты, а не один продукт валяется. Если скажешь /product, все подумают, что ты про один конкретный, а нихуя — там список. Запутаешь всех, включая себя через месяц.

Теперь про вложенность. Это как матрёшка, блядь. Хочешь заказы пользователя? Так и строй путь: /users/{userId}/orders. Прям видно, что заказы внутри пользователя. Чисто, понятно, в рот меня чих-пых. Не надо выдумывать /getUserOrders?userId=123. Это же пиздец какой-то, честное слово. Смотри, как красиво:

# Это говно какое-то, не делай так
GET /getUserOrders?userId=123

# А вот это — красота, RESTful как швейцарские часы
GET /users/123/orders

Чувствуешь разницу? Во втором случае даже обезьяна поймёт, что мы лезем к юзеру 123 и смотрим его ордера.

А если надо отсортировать, отфильтровать или страницу какую выбрать — это query-параметры. Не лепи всё в путь! Путь — это святое, это адрес ресурса. А всякие ?category=electronics&sort=price — это уже уточнения, как тебе этот ресурс подать. Разделяй, блядь, мух и котлеты.

И да, чуть не забыл — в URL используй kebab-case, через дефис. user-roles, client-profiles. Не userRoles (это camelCase, он для кода) и не user_roles (это snake_case, он для баз). В URL дефисы читабельнее, и браузеры их любят. Не усложняй, ёбаный насос.

Короче, вся суть в том, чтобы API был предсказуемым. Как хороший друг — не подставляет, не меняет правила игры. Захотел создать юзера — POST на /users. Удалить — DELETE на /users/456. Всё. Никакой магии. А то начнёшь выдумывать /doActionWithUser, и потом сам будешь ебаться, вспоминая, как это работает. Доверия к такому API — ноль ебать. Делай по уму, не будь распиздяем.