Что такое REST API и его основные принципы?

Ответ

REST (Representational State Transfer) API — это архитектурный стиль для построения распределённых веб-сервисов. Он использует стандартные протоколы и методы HTTP для взаимодействия клиента и сервера. Данные обычно передаются в форматах JSON или XML.

Ключевые принципы REST (ограничения архитектуры):

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

    • Ресурсы: всё представляется как ресурс с уникальным URI (например, /api/users, /api/orders/123).
    • Манипуляция ресурсами через представления: клиент работает с представлением ресурса (JSON), а не с самим ресурсом напрямую.
    • Самодостаточные сообщения: каждый запрос содержит всю информацию, необходимую для его обработки.
    • HATEOAS (Hypermedia as the Engine of Application State): ответы могут содержать ссылки на другие доступные действия с ресурсом.
  2. Отсутствие состояния (Stateless)

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

    • Ответы сервера должны явно указывать, можно ли их кэшировать и как долго, чтобы повысить производительность.
  4. Клиент-серверная архитектура (Client-Server)

    • Чёткое разделение обязанностей: клиент отвечает за UI и логику отображения, сервер — за хранение данных и бизнес-логику.
  5. Многоуровневая система (Layered System)

    • Архитектура может состоять из нескольких уровней (балансировщики, прокси, шлюзы), что повышает масштабируемость и безопасность.

Сопоставление HTTP-методов и операций CRUD:

HTTP-метод Операция CRUD Пример URI Действие
GET Read (Чтение) GET /api/users Получить список пользователей
GET Read (Чтение) GET /api/users/1 Получить пользователя с id=1
POST Create (Создание) POST /api/users Создать нового пользователя
PUT Update (Обновление/Замена) PUT /api/users/1 Заменить данные пользователя с id=1
PATCH Update (Частичное обновление) PATCH /api/users/1 Частично обновить данные пользователя
DELETE Delete (Удаление) DELETE /api/users/1 Удалить пользователя с id=1

Пример запроса и ответа:

### Запрос на создание пользователя (POST)
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer <token>

{
  "name": "Alice",
  "email": "alice@example.com"
}
// Ответ сервера (201 Created)
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/users/101

{
  "id": 101,
  "name": "Alice",
  "email": "alice@example.com",
  "createdAt": "2023-10-01T12:00:00Z",
  "_links": {
    "self": { "href": "/api/users/101" },
    "orders": { "href": "/api/users/101/orders" }
  }
}

Коды состояния HTTP (Status Codes), которые важно проверять при тестировании:

  • 2xx — Успех (200 OK, 201 Created).
  • 4xx — Ошибка клиента (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found).
  • 5xx — Ошибка сервера (500 Internal Server Error, 502 Bad Gateway).

REST широко распространён благодаря своей простоте, использованию стандартов HTTP и хорошей масштабируемости.

Ответ 18+ 🔞

Э, слушай, смотри, вот эта вся ваша REST API хуйня, она на самом деле проще, чем кажется, если не забивать голову умными книжками. Представь себе барную стойку, только для программ.

REST API — это, блядь, такой способ твоему приложению-клиенту общаться с сервером, как будто он заказывает напитки у бармена. Использует он для этого обычный HTTP, который везде, а данные шлёт в JSON — это как меню, которое все понимают.

Вот на чём вся эта архитектура держится, её основные правила, блядь:

  1. Единый интерфейс, как у всех нормальных баров (Uniform Interface)

    • Всё — ресурс. Хочешь пользователей? Вот тебе /api/users. Хочешь конкретного? На, /api/users/1. Это как сказать: «Дайте мне водки» или «Дайте мне вот ту самую бутылку «Белуги» с верхней полки».
    • Работаешь с копией. Ты ж не лезешь за стойку сам наливать? Ты говоришь бармену. Он тебе приносит стакан (JSON) — вот это и есть представление ресурса. Работаешь с ним.
    • В каждом заказе всё есть. «Мне виски со льдом, вот мои права и деньги». Серверу не надо помнить, что ты там пять минут назад спрашивал. Всё в одном запросе.
    • HATEOAS (этот ёбаный акроним). Это когда в ответе тебе ещё и намекают, что делать дальше. Типа: «Вот твой заказ, а к нему можно взять чипсы (ссылка /api/snacks) или рассол (ссылка /api/pickles)».
  2. Без состояния (Stateless) — главное правило!

    • Сервер — золfish, ёпта. Он тебя не помнит от слова совсем. Пришёл новый запрос — для него ты новый клиент. Поэтому в каждом своём «заказе» ты должен таскать с собой все свои «документы» (токен в заголовках, обычно). Иначе получишь 401 Unauthorized и пойдёшь нахуй.
  3. Кэшируемость (Cacheable)

    • Чтобы серверу по сто раз не делать одно и то же, он может сказать: «Информация по акциям на пиво обновляется раз в час, так что запомни (закэшируй) этот ответ и не дергай меня попусту».
  4. Клиент-сервер

    • Ну тут всё ясно. Клиент (приложение на телефоне) — это ты, который орет «Мне пива!». Сервер — это бармен, который знает, где пиво хранится, сколько стоит и имеет право тебе его налить (или нет).
  5. Многоуровневость (Layered System)

    • Между тобой и барменом может быть цепочка: ты -> вышибала (балансировщик) -> официант (шлюз) -> сам бармен. Ты этого не видишь и тебе похуй. Это для масштабируемости и безопасности.

А вот самое сочное — как HTTP-методы с CRUD соотносятся. Запоминай, это основа:

Метод HTTP CRUD-операция Пример (что просим) Что делаем
GET Read (Прочитать) GET /api/beers Дайте список всего пива!
GET Read (Прочитать) GET /api/beers/42 Дайте конкретно «Балтику №42»!
POST Create (Создать) POST /api/orders Я вот новый заказ создаю (два пива и чипсы).
PUT Update (Заменить) PUT /api/orders/777 Весь заказ №777 меняю на «три текилы».
PATCH Update (Поправить) PATCH /api/orders/777 К заказу №777 добавьте ещё один стакан воды, пожалуйста.
DELETE Delete (Удалить) DELETE /api/orders/777 Отмена! Весь заказ №777 в пизду!

Ну и пример, как это выглядит вживую, блядь:

### Клиент создаёт новый заказ (POST)
POST /api/orders HTTP/1.1
Host: bar.example.com
Content-Type: application/json
Authorization: Bearer <мой_токен_чтоб_меня_узнали>

{
  "drink": "Виски",
  "quantity": 2
}
// Ответ бармена-сервера (201 Created — создано, молодец)
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/orders/9001 // Смотри, заказ под номером 9001!

{
  "id": 9001,
  "drink": "Виски",
  "quantity": 2,
  "status": "В процессе наливания",
  "createdAt": "2023-10-01T12:00:00Z",
  "_links": { // Ссылочки, тот самый HATEOAS, на!
    "self": { "href": "/api/orders/9001" },
    "add_snack": { "href": "/api/orders/9001/snacks" } // Можешь ещё закуску добавить
  }
}

И напоследок, коды ответов, их проверяй всегда, а то останешься без пива:

  • 2xx — Всё охуенно, проходи (200 OK, 201 Created).
  • 4xx — Это ты, мудак, накосячил (400 — хуёвый запрос, 401 — не представился, 403 — доступ запрещён, 404 — такого ресурса нет, иди нахуй).
  • 5xx — Это уже сервер обосрался (500 — внутренняя ошибка, 502 — плохой шлюз, и т.д.).

Вот и вся магия, ёпта. Никакой чертовщины, просто договорённости, как общаться. Просто, как три копейки, и поэтому везде используется.