Ответ
REST (Representational State Transfer) — это набор архитектурных ограничений для построения веб-сервисов. Его основные принципы:
-
Единообразие интерфейса (Uniform Interface): Стандартизация взаимодействия.
- Ресурсы идентифицируются URI (например,
/api/users/1). - Действия над ресурсами определяются HTTP-методами: GET (чтение), POST (создание), PUT (полное обновление), PATCH (частичное обновление), DELETE (удаление).
- Самодостаточные сообщения (заголовки, тело).
- HATEOAS (Hypermedia as the Engine of Application State) — ссылки на связанные ресурсы в ответе.
- Ресурсы идентифицируются URI (например,
-
Отсутствие состояния (Stateless): Каждый запрос от клиента содержит всю информацию, необходимую серверу для его обработки. Сервер не хранит состояние сессии клиента.
-
Кэшируемость (Cacheable): Ответы сервера должны явно указывать, можно ли их кэшировать, чтобы повысить производительность.
-
Клиент-серверная архитектура: Четкое разделение обязанностей.
-
Многоуровневая система (Layered System): Клиент не знает, взаимодействует ли он с конечным сервером или с промежуточным узлом (прокси, балансировщик).
-
Код по требованию (Code on Demand, опционально): Сервер может временно расширять функциональность клиента, передавая исполняемый код (например, JavaScript).
Пример REST-запроса и ответа:
GET /api/users/1 HTTP/1.1
Host: api.example.com
Accept: application/json
{
"id": 1,
"name": "John Doe",
"_links": {
"self": { "href": "/api/users/1" },
"posts": { "href": "/api/users/1/posts" }
}
} Ответ 18+ 🔞
А, слушай, смотри, вот эта ваша REST-архитектура, блядь. Это не какая-то там магия, а просто набор правил, как сервисам в интернете друг с другом общаться, чтобы не получилась пиздопроебибна.
Представь, что твой сервер — это такой строгий официант в дорогом ресторане, а клиенты — это посетители. И правила у них, блядь, железные.
Во-первых, единообразие интерфейса. Это чтобы не было как в том анекдоте: «принесите мне кофе, но кружку держите левой рукой, а сахар сыпьте с подмигиванием». Всё стандартно, ёпта!
- Каждая штука — пользователь, заказ, котик — это ресурс со своим адресом (URI). Хочешь пользователя номер 1? Вот тебе
/api/users/1. Прозрачно, как слёзы ребёнка. - Что с ним делать — говорит HTTP-метод. Просто, блядь, гениально:
- GET — «дай посмотреть» (прочитать).
- POST — «вот, создай новенького» (создать).
- PUT — «перепиши всё вот по этим данным» (полностью обновить).
- PATCH — «подправь только имя, остальное не трожь» (частично обновить).
- DELETE — «убери это с моих глаз, нахуй» (удалить).
- А ещё есть такая приблуда — HATEOAS. Это когда в ответе тебе не просто данные кидают, а ещё и ссылочки «а вот тут его посты лежат», «а вот тут его друзья». Чтобы ты, как клиент, не шарился по всему серверу в поисках, а тебя вели за ручку. Красота, блядь!
Во-вторых, отсутствие состояния. Это святое! Сервер — он как золотая рыбка, память хуёвая. Каждый твой запрос должен быть самодостаточным: «я Вася, вот мой токен, дай мне данные пользователя 1». Сервер посмотрел, обработал, ответил и сразу забыл про тебя. Не хранит он у себя в подвале сессии, кто что просил пять минут назад. С одной стороны, масштабируемость — овердохуища, с другой — каждый раз надо все данные в запрос пихать.
Остальные принципы тоже логичные:
- Кэшируемость: Сервер может сказать: «Эти данные не менялись, браузер/прокси, держи их у себя, не дергай меня по пустякам». Производительность летит вверх, как хуй с горы.
- Клиент-сервер: Чёткое разделение. Клиент рисует кнопочки и формы, сервер работает с данными и логикой. Не лезут друг другу в тарелки.
- Многоуровневая система: Клиенту похуй, общается он напрямую с сервером или через десять прокси и балансировщиков. Для него интерфейс один.
- Код по требованию (опционально): Ну это вообще редкость. Типа сервер может сказать: «На, выполни этот скрипт, чтобы я тебе картинку в другом формате отдал». Как по мне, так лишняя головная боль, но в теории возможно.
Ну и пример, чтобы вообще всё встало на свои места, блядь:
Ты, как клиент, шлёшь запрос — «Дай-ка мне пользователя №1, в формате JSON, пожалуйста».
GET /api/users/1 HTTP/1.1
Host: api.example.com
Accept: application/json
А тебе в ответ такой аккуратный пакетик:
{
"id": 1,
"name": "John Doe",
"_links": {
"self": { "href": "/api/users/1" },
"posts": { "href": "/api/users/1/posts" }
}
}
Вот видишь? Данные есть. И даже ссылочки на его посты прицепили (HATEOAS), чтобы ты не гадал, где их искать. Всё чётко, без лишней суеты. Вот и вся философия, ёпта. Не так страшен REST, как его малюют.