Ответ
REST (Representational State Transfer) API — это архитектурный стиль для построения распределённых веб-сервисов. Он использует стандартные протоколы и методы HTTP для взаимодействия клиента и сервера. Данные обычно передаются в форматах JSON или XML.
Ключевые принципы REST (ограничения архитектуры):
-
Единообразие интерфейса (Uniform Interface)
- Ресурсы: всё представляется как ресурс с уникальным URI (например,
/api/users,/api/orders/123). - Манипуляция ресурсами через представления: клиент работает с представлением ресурса (JSON), а не с самим ресурсом напрямую.
- Самодостаточные сообщения: каждый запрос содержит всю информацию, необходимую для его обработки.
- HATEOAS (Hypermedia as the Engine of Application State): ответы могут содержать ссылки на другие доступные действия с ресурсом.
- Ресурсы: всё представляется как ресурс с уникальным URI (например,
-
Отсутствие состояния (Stateless)
- Сервер не хранит состояние клиента между запросами. Каждый запрос должен содержать всю необходимую аутентификационную и контекстную информацию (обычно в заголовках).
-
Кэшируемость (Cacheable)
- Ответы сервера должны явно указывать, можно ли их кэшировать и как долго, чтобы повысить производительность.
-
Клиент-серверная архитектура (Client-Server)
- Чёткое разделение обязанностей: клиент отвечает за UI и логику отображения, сервер — за хранение данных и бизнес-логику.
-
Многоуровневая система (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 — это как меню, которое все понимают.
Вот на чём вся эта архитектура держится, её основные правила, блядь:
-
Единый интерфейс, как у всех нормальных баров (Uniform Interface)
- Всё — ресурс. Хочешь пользователей? Вот тебе
/api/users. Хочешь конкретного? На,/api/users/1. Это как сказать: «Дайте мне водки» или «Дайте мне вот ту самую бутылку «Белуги» с верхней полки». - Работаешь с копией. Ты ж не лезешь за стойку сам наливать? Ты говоришь бармену. Он тебе приносит стакан (JSON) — вот это и есть представление ресурса. Работаешь с ним.
- В каждом заказе всё есть. «Мне виски со льдом, вот мои права и деньги». Серверу не надо помнить, что ты там пять минут назад спрашивал. Всё в одном запросе.
- HATEOAS (этот ёбаный акроним). Это когда в ответе тебе ещё и намекают, что делать дальше. Типа: «Вот твой заказ, а к нему можно взять чипсы (ссылка
/api/snacks) или рассол (ссылка/api/pickles)».
- Всё — ресурс. Хочешь пользователей? Вот тебе
-
Без состояния (Stateless) — главное правило!
- Сервер — золfish, ёпта. Он тебя не помнит от слова совсем. Пришёл новый запрос — для него ты новый клиент. Поэтому в каждом своём «заказе» ты должен таскать с собой все свои «документы» (токен в заголовках, обычно). Иначе получишь 401 Unauthorized и пойдёшь нахуй.
-
Кэшируемость (Cacheable)
- Чтобы серверу по сто раз не делать одно и то же, он может сказать: «Информация по акциям на пиво обновляется раз в час, так что запомни (закэшируй) этот ответ и не дергай меня попусту».
-
Клиент-сервер
- Ну тут всё ясно. Клиент (приложение на телефоне) — это ты, который орет «Мне пива!». Сервер — это бармен, который знает, где пиво хранится, сколько стоит и имеет право тебе его налить (или нет).
-
Многоуровневость (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 — плохой шлюз, и т.д.).
Вот и вся магия, ёпта. Никакой чертовщины, просто договорённости, как общаться. Просто, как три копейки, и поэтому везде используется.