Ответ
REST (Representational State Transfer) — архитектурный стиль для построения распределенных систем, использующий протокол HTTP. REST API — это интерфейс, соответствующий этому стилю.
Ключевые принципы (ограничения) REST:
- Единообразие интерфейса:
- Ресурсы идентифицируются URI (например,
/api/users/123). - Действия над ресурсами определяются HTTP-методами (GET, POST, PUT, DELETE, PATCH).
- Самодостаточные сообщения (заголовки, тело, коды состояния).
- Гипермедиа (HATEOAS) — ссылки на связанные ресурсы в ответе (опционально на практике).
- Ресурсы идентифицируются URI (например,
- Отсутствие состояния (Stateless): Каждый запрос от клиента содержит всю информацию, необходимую серверу для его обработки. Сессия не хранится на сервере.
- Кэшируемость: Ответы должны явно помечаться как кэшируемые или нет.
- Клиент-серверная архитектура: Четкое разделение ответственности.
- Слои: Система может состоять из нескольких слоев (прокси, балансировщики), что не влияет на взаимодействие.
Пример типичного RESTful взаимодействия:
# Получение ресурса
GET /api/books/45 HTTP/1.1
Host: example.com
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 45,
"title": "Clean Code",
"author": "Robert Martin",
"_links": {
"self": "/api/books/45",
"author": "/api/authors/12"
}
}
# Создание ресурса
POST /api/books HTTP/1.1
Host: example.com
Content-Type: application/json
{"title": "New Book", "authorId": 12}
HTTP/1.1 201 Created
Location: /api/books/46
Для тестирования REST API используются инструменты вроде Postman, RestAssured (Java) или requests (Python), проверяющие корректность HTTP-методов, кодов состояния, схемы JSON-ответов и бизнес-логики.
Ответ 18+ 🔞
Давай разберёмся с этим REST'ом, а то народ его как мантру повторяет, а на деле-то нихуя не понимает. Слушай сюда, это ж просто набор правил, как общаться с сервером, чтобы не превратиться в стадо баранов, которые каждый раз по-новому изобретают велосипед.
REST (Representational State Transfer) — это, блядь, такой архитектурный стиль, свод негласных законов для распределённых систем, где главный протокол — наш старый добрый HTTP. REST API — это просто интерфейс, который эти законы соблюдает. Не боги горшки обжигают.
Ключевые принципы (они же ограничения, чтобы не распизделись):
-
Единообразие интерфейса (Uniform Interface):
- Всё, с чем работаешь — это ресурсы. И у каждого ресурса есть свой уникальный адрес — URI. Хочешь книгу?
/api/books/123. Хочешь пользователя?/api/users/456. Всё логично, как в библиотеке, а не как в помойке. - Что с ресурсом делать — говорит HTTP-метод. Не выдумывай свои глаголы типа
/api/books/delete/123. ПростоDELETE /api/books/123. GET — получить, POST — создать, PUT — обновить целиком, PATCH — чутка подправить, DELETE — нахуй удалить. Элементарно, Ватсон! - Каждый запрос — самодостаточный. Всё, что нужно серверу, ты ему в этом одном запросе и отправляешь: заголовки, тело, аутентификацию. Он не должен вспоминать, кто ты такой и что ты в прошлый раз хотел.
- Гипермедиа (HATEOAS) — это, в идеале, когда в ответе сервер тебе не только данные даёт, но и ссылочки на всё связанное. Типа «вот книга, а вот ссылка на её автора». На практике эту хуйню часто опускают, потому что лень, но принцип-то красивый, ёпта!
- Всё, с чем работаешь — это ресурсы. И у каждого ресурса есть свой уникальный адрес — URI. Хочешь книгу?
-
Отсутствие состояния (Stateless): Это святое! Сервер — не твоя мамка, чтобы запоминать твои сессии. Каждый твой запрос должен нести в себе ВСЮ информацию для его обработки. Авторизационный токен? Тащи в заголовке. Параметры фильтрации? В URI или теле. Сервер обработал и забыл. Масштабируемость за счёт простоты, вот и весь секрет.
-
Кэшируемость: Чтобы серверу по сто раз на дню не отвечать на одни и те же идиотские вопросы, ответы должны чётко говорить: «Меня можно закэшировать на пять минут» или «Я уникальный, не кэшируй меня, мудак». За это отвечают специальные HTTP-заголовки.
-
Клиент-сервер: Чёткое разделение труда. Клиент (приложение на телефоне или в браузере) отвечает за интерфейс и логику отображения. Сервер — за данные, безопасность и бизнес-правила. Они общаются через API и не лезут в дела друг друга. Идеальный брак.
-
Слои (Layered System): Между тобой и сервером может быть овердохуища промежуточных штук: прокси, балансировщики нагрузки, файрволы. Тебе, как клиенту, похуй. Ты общаешься с конечной точкой, а она уже там сама разбирается, через какие слои пролезть. Главное — интерфейс не меняется.
Пример, как это всё выглядит вживую:
# Получение ресурса (просто читаем, ничего не ломаем)
GET /api/books/45 HTTP/1.1
Host: example.com
Accept: application/json
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 45,
"title": "Clean Code",
"author": "Robert Martin",
"_links": {
"self": "/api/books/45", // Ссылка на себя (вот она, гипермедиа!)
"author": "/api/authors/12" // А вот и автор, можешь перейти
}
}
# Создание ресурса (рождаем новую сущность)
POST /api/books HTTP/1.1
Host: example.com
Content-Type: application/json
{"title": "New Book", "authorId": 12}
HTTP/1.1 201 Created // Всё создалось, красота!
Location: /api/books/46 // Держи адрес, где твой новорождённый лежит
А как это тестировать, спросишь? Да обычными инструментами, которых дохуя! Postman, Insomnia — чтобы вручную потыкать. Для автоматизации — RestAssured в Java, requests в Python, Supertest в Node.js. Проверяешь: тот ли HTTP-метод сработал, вернулся ли правильный код состояния (не 200 на всё подряд, а 404 если нет, 400 если кривой запрос), соответствует ли JSON ответа ожидаемой схеме и логике. Всё, блядь, просто как три копейки. Главное — не нарушай принципы, и будет тебе счастье, а не ебаный тык-тык в полной темноте.