rest api
REST API (Representational State Transfer Application Programming Interface) — архитектурный стиль взаимодействия между программными системами через протокол HTTP. Термин «REST» ввёл Рой Филдинг в своей докторской диссертации 2000 года, описав набор ограничений для создания масштабируемых распределённых систем. REST API сегодня является самым распространённым способом построения веб-сервисов, позволяя клиентам и серверам обмениваться данными независимо от технологий реализации.
Шесть принципов REST
Филдинг определил шесть архитектурных ограничений, соответствие которым делает API «RESTful»:
- Клиент-сервер — разделение ответственности: клиент управляет UI и пользовательским состоянием, сервер — хранением данных и бизнес-логикой. Они взаимодействуют только через унифицированный интерфейс.
- Stateless (без состояния) — каждый запрос содержит всю информацию, необходимую серверу для его обработки. Сервер не хранит сессионное состояние между запросами. Это ключевое ограничение для масштабируемости: любой экземпляр сервера может обработать любой запрос.
- Кэшируемость — ответы должны явно помечаться как кэшируемые или нет (заголовки Cache-Control, ETag). Кэш на стороне клиента или CDN снижает нагрузку на сервер.
- Единообразный интерфейс — стандартизированное взаимодействие через HTTP-методы, URI-идентификаторы ресурсов и согласованные форматы ответов.
- Многоуровневая система — между клиентом и сервером могут быть промежуточные слои (прокси, балансировщики, CDN), прозрачные для клиента.
- Код по требованию (необязательное) — сервер может передавать клиенту исполняемый код (JavaScript), расширяя его функциональность.
HTTP-методы и их семантика
REST использует стандартные HTTP-методы для операций над ресурсами:
- GET — получение ресурса или коллекции. Идемпотентный, безопасный. Не должен изменять состояние.
- POST — создание нового ресурса или выполнение действия. Не идемпотентный.
- PUT — полная замена ресурса. Идемпотентный: повторный запрос с теми же данными даёт тот же результат.
- PATCH — частичное обновление ресурса (только изменённые поля).
- DELETE — удаление ресурса. Идемпотентный.
- HEAD — как GET, но без тела ответа. Используется для проверки существования ресурса.
- OPTIONS — получение поддерживаемых методов. Используется при CORS preflight-запросах.
Дизайн URI: именование ресурсов
Хорошо спроектированный REST API использует существительные во множественном числе для ресурсов и иерархическую структуру URI:
- GET /users — список пользователей
- GET /users/{id} — конкретный пользователь
- POST /users — создание пользователя
- GET /users/{id}/orders — заказы конкретного пользователя
- PUT /users/{id}/orders/{orderId} — обновление заказа
Глаголы в URI — антипаттерн: не /getUser, а GET /users/{id}. Действия, не укладывающиеся в CRUD, выражают через субресурсы: POST /orders/{id}/cancel.
HTTP-статусы и обработка ошибок
Коды состояния HTTP передают семантику ответа:
- 2xx — успех: 200 OK, 201 Created, 204 No Content.
- 3xx — перенаправление: 301 Moved Permanently, 304 Not Modified.
- 4xx — ошибка клиента: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable Entity, 429 Too Many Requests.
- 5xx — ошибка сервера: 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable.
Тело ошибки должно содержать структурированную информацию (RFC 7807 Problem Details): тип ошибки, человекочитаемое сообщение, детали для отладки.
Форматы данных и заголовки
REST не обязывает использовать конкретный формат данных, но JSON стал стандартом де-факто. Заголовок Content-Type: application/json указывает формат тела запроса, Accept: application/json — предпочитаемый формат ответа. Для бинарных данных (файлы) используется multipart/form-data или прямой бинарный поток.
Версионирование REST API
Версионирование API необходимо для поддержки клиентов при внесении ломающих изменений. Три подхода: в пути URL (/v1/users, наиболее распространён), в заголовке (Accept: application/vnd.api+json;version=2) и в query-параметре (/users?version=2). Рекомендуется избегать ломающих изменений в существующих версиях и поддерживать предыдущую версию минимум 6–12 месяцев после выхода новой.
REST vs GraphQL vs gRPC
REST прост, широко поддерживается и хорошо кэшируется. GraphQL позволяет клиенту точно указать нужные поля, решая проблемы over-fetching и under-fetching, но сложнее в кэшировании. gRPC использует Protocol Buffers и HTTP/2, обеспечивая высокую производительность и строгую типизацию — идеален для внутренней межсервисной коммуникации. Выбор зависит от задачи: REST остаётся оптимальным для публичных API и простых CRUD-сервисов.
Частые вопросы
Что означает «stateless» в REST?
Stateless означает, что сервер не хранит информацию о сессии клиента между запросами. Каждый запрос самодостаточен и содержит всё необходимое для обработки (токен аутентификации, параметры). Это позволяет масштабировать API горизонтально: любой сервер в кластере может обработать любой запрос, не обращаясь к общему хранилищу сессий.
Чем PUT отличается от PATCH?
PUT заменяет ресурс целиком: если передать объект только с одним полем, остальные поля будут сброшены. PATCH выполняет частичное обновление: только переданные поля изменяются, остальные остаются прежними. PATCH используют для изменения конкретных атрибутов без необходимости передавать весь объект.
Как документировать REST API?
Стандартом де-факто является OpenAPI (ранее Swagger) — формат YAML/JSON для описания эндпоинтов, параметров, схем запросов и ответов. Из OpenAPI-спецификации автоматически генерируется интерактивная документация (Swagger UI, Redoc), клиентские SDK и серверные заглушки. Postman Collections — альтернативный способ документировать и тестировать API.
Другие термины в теме «Веб-разработка»
Не хватает деталей?
Напишите, что уточнить по теме «rest api» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).