REST API в 2026 году по-прежнему остается рабочей лошадкой для веб-сервисов, мобильных приложений, внутренних платформ и B2B-интеграций. Ниже — практический гайд по проектированию: как называть endpoints, выбирать статус-коды, строить пагинацию, внедрять авторизацию, не сломать обратную совместимость и не подарить злоумышленнику лишнюю поверхность атаки.
Что такое REST в 2026 и его альтернативы
REST давно перестал быть модным словом из презентации архитектора и стал базовой дисциплиной. В 2026 году под ним обычно понимают не «любой JSON по HTTP», а набор вполне конкретных принципов: ресурсная модель, единообразный интерфейс, использование стандартной семантики HTTP, явная работа с кэшированием, кодами ответа и ссылками на ресурсы. И если сервис отвечает на POST /doSomething пачкой полей в произвольном формате, это еще не делает его REST.
Что реально важно из классических ограничений
В повседневной разработке не все ограничения REST одинаково полезны. Статус «stateless» критичен почти всегда: сервер не должен хранить сессионный контекст между запросами клиента, если это не продиктовано отдельной бизнес-логикой. Единообразный интерфейс тоже не декоративная теория: клиенту проще жить, когда коллекция читается через GET /users, один объект — через GET /users/{id}, обновление — через PATCH или PUT, удаление — через DELETE.
Гипермедиа как обязательный стиль управления API на практике встречается редко. Большинство команд берут из REST то, что дает предсказуемость и низкий порог входа, а не все архитектурные догмы целиком. Это нормально. Важнее не спорить о терминологии, а сделать интерфейс стабильным и понятным.
Почему подход живее многих прогнозов о его смерти
Причина банальна: HTTP знают все. Его понимают прокси, CDN, балансировщики, observability-стек, WAF, SDK-генераторы и любой инженер, которого разбудили ночью. Для 70-80% корпоративных сценариев этого достаточно. CRUD, списки, фильтры, webhook-обратки, кабинет партнера, админка, мобильный backend, платежная интеграция — все это отлично работает без экзотики.
- Низкий когнитивный порог для новых команд и подрядчиков.
- Хорошая совместимость с кэшами, CDN и стандартными инструментами тестирования.
- Простая интеграция с OpenAPI, SDK-генерацией и contract testing.
- Устойчивость к организационному хаосу: API переживает смену команды лучше, чем самописный RPC-стиль.
Какие альтернативы реально конкурируют
Главные альтернативы сегодня — GraphQL, gRPC и событийные интерфейсы через webhooks или очереди. GraphQL силен там, где клиенту нужно собирать сложные графы данных и получать ровно нужные поля. gRPC хорош для внутренних сервисов с высокими требованиями к производительности, строгим контрактам и стримингу. Webhooks и event-driven подход полезны там, где модель «спросил-ответил» слишком медленная или дорогая.
Но в типичном продукте это не война религий, а разделение труда. Внешний публичный интерфейс часто остается HTTP-ориентированным, а внутри компании соседствуют RPC и асинхронные шины. Проблема начинается не тогда, когда вы выбрали не тот стиль, а когда вы не понимаете цену этого выбора через 12 месяцев поддержки.
Структура endpoints и ресурсная модель
Хорошая ресурсная модель экономит недели поддержки. Плохая заставляет плодить хаос: /getAllUsers, /user/updateStatus, /deleteProductByAdmin и прочие памятники раннему энтерпрайзу. У REST API endpoint должен описывать ресурс и отношение к нему, а не внутренний метод сервиса.
Думайте сущностями, а не действиями
Базовое правило простое: в URL лучше существительные, а не глаголы. Коллекция — это /orders, конкретный объект — /orders/{orderId}, вложенный ресурс — /orders/{orderId}/items. Действия допустимы, но как исключение. Например, когда операция не укладывается в обычную CRUD-модель: POST /invoices/{id}/send или POST /users/{id}/reset-password.
Если глагольных endpoint'ов становится много, это сигнал, что доменная модель не выдерживает нагрузки. Возможно, у вас не «метод смены статуса», а отдельный ресурс жизненного цикла, истории изменений или команд.
Правила именования, которые реально работают
- Используйте множественное число для коллекций:
/users,/payments. - Соблюдайте единый стиль: чаще всего
kebab-caseили просто lowercase. - Не шейте в URI роли и каналы:
/admin/usersдопустимо только как отдельная bounded context-зона, а не как костыль прав доступа. - Не вкладывайте URL глубже 2-3 уровней без веской причины.
- Не раскрывайте внутреннюю БД-модель один в один, если она сама по себе неудачна.
Плоская и вложенная модель: где баланс
Вложенность полезна, когда она выражает контекст. /users/{id}/sessions читается лучше, чем абстрактное /sessions?userId=..., если сессии осмыслены именно в рамках пользователя. Но слишком глубокие деревья плохо живут: /companies/{id}/departments/{id}/teams/{id}/members/{id} уже выглядит как способ наказать клиента.
Практика показывает, что для большинства API хватает двух шаблонов:
- Коллекция и объект:
/products,/products/{id}. - Контекстный подресурс:
/orders/{id}/events,/projects/{id}/members.
| Плохо | Лучше | Почему |
|---|---|---|
/getUserById?id=42 |
/users/42 |
Четкая ресурсная модель |
/createOrder |
POST /orders |
Семантика в HTTP-методе |
/user/42/orders/list |
/users/42/orders |
Короче и предсказуемее |
Наконец, не экономьте на идентификаторах. Если у вас публичный API, UUID, ULID или непрозрачные строковые ID обычно безопаснее автоинкремента. Они хуже индексируются в некоторых СУБД, но лучше скрывают соседние записи и реже провоцируют BOLA-проблемы.
HTTP-методы и статус-коды правильно
Большая часть боли в интеграциях появляется не из-за бизнес-логики, а из-за сломанной семантики HTTP. Когда создание ресурса возвращает 200 OK без ссылки на новый объект, удаление всегда отвечает 200 с телом «deleted=true», а валидационная ошибка маскируется под 500, клиент быстро начинает относиться к интерфейсу как к капризному собеседнику. Для REST API это особенно вредно: стандартные механизмы HTTP теряют смысл.
Методы: не путайте идемпотентность и «мне так удобнее»
GET— чтение без побочных эффектов.POST— создание или запуск неидемпотентной операции.PUT— полная замена ресурса или upsert, если это явно описано.PATCH— частичное изменение.DELETE— удаление ресурса.
PUT и DELETE должны быть идемпотентными: повторный запрос не обязан давать тот же ответ, но не должен каждый раз создавать новый эффект. Именно поэтому повторный DELETE /users/42 обычно возвращает 204 или 404, а не удаляет «что-то еще».
Статус-коды, которые стоит использовать осознанно
| Код | Когда использовать | Частая ошибка |
|---|---|---|
200 OK |
Успешное чтение или изменение с телом ответа | Возвращать при создании вместо 201 |
201 Created |
Создан новый ресурс | Не отдавать Location |
202 Accepted |
Асинхронная операция принята в работу | Использовать для уже завершенного действия |
204 No Content |
Успех без тела ответа | Класть JSON в пустой ответ |
400 Bad Request |
Синтаксически плохой запрос | Сваливать сюда все подряд |
401 Unauthorized |
Нет или невалидна аутентификация | Путать с правами доступа |
403 Forbidden |
Пользователь известен, но действие запрещено | Возвращать вместо 401 |
404 Not Found |
Ресурс не найден | Использовать для любой бизнес-ошибки |
409 Conflict |
Конфликт состояния, дубликат, гонка | Заменять на 422 без причины |
422 Unprocessable Content |
Формат понятен, но данные не проходят валидацию | Путать с 400 |
429 Too Many Requests |
Сработал rate limit | Отвечать 403 |
Три практических правила
- Если ресурс создан, отдайте
201и URI нового объекта. - Если операция длится дольше 1-3 секунд и обрабатывается очередью, лучше
202плюс endpoint статуса задачи. - Если ошибка вызвана клиентом, не прячьте ее под
500. Это ломает ретраи, мониторинг и аналитику инцидентов.
Нормальная семантика HTTP заметно сокращает интеграционные баги, потому что клиентские SDK, reverse proxy и observability-инструменты начинают работать так, как им и было задумано.
Пагинация, фильтрация, сортировка
Списки — самое недооцененное место в API-дизайне. Именно здесь обычно прячутся медленные запросы, случайные full scan по таблице на 40 млн строк и UX, в котором одна и та же страница выдает разные результаты при одинаковых параметрах. Если заранее не договориться о правилах выборки, платить потом будет и база, и клиент.
Пагинация: offset удобен, cursor живет дольше
Offset/limit хорош для простых бэкофисов и каталогов до умеренных объемов данных. Он понятен, его легко дебажить, а на диапазонах в 1-10 тыс. строк разница часто некритична. Но на больших таблицах смещение в 50 тыс., 100 тыс. или 1 млн строк начинает бить по производительности и стабильности результата.
Cursor pagination лучше подходит для быстро меняющихся коллекций: ленты событий, логов, транзакций, заказов. Вместо «дай страницу 5» клиент говорит «дай следующие 50 записей после курсора X». Это устойчивее к вставкам между запросами и обычно лучше сочетается с индексом по created_at или составному ключу.
| Подход | Когда подходит | Ограничения |
|---|---|---|
offset + limit |
Админки, простые каталоги, небольшие наборы | Дорогие глубокие смещения |
cursor |
Ленты, события, большие коллекции | Сложнее реализовать и тестировать |
since_id/after_id |
Монотонные ID и импорт данных | Плохо работает при сложной сортировке |
Фильтрация без зоопарка параметров
Фильтры должны быть простыми и композиционными. В реальности чаще всего хватает такой схемы:
?status=active?country=ru?created_from=2026-01-01&created_to=2026-01-31?price_gte=1000&price_lte=5000
Не стоит тащить в query string мини-язык уровня ORM, если у вас нет реального кейса. Параметры типа filter[user][company][region][in]=... быстро превращают API в квест. Если фильтрация становится сложнее 10-15 параметров и требует логических операторов, лучше подумать об отдельном search-endpoint или даже о другой модели запроса.
Сортировка и метаданные ответа
Сортировка должна быть детерминированной. Если используете sort=-created_at, добавьте вторичный ключ, например ID, чтобы порядок был стабилен при одинаковом timestamp. В ответе удобно возвращать не только данные, но и метаданные выборки:
- размер страницы;
- cursor или next token;
- общее количество — только если оно не слишком дорогое;
- признак
has_more.
Подсчет total на таблицах в десятки миллионов строк может стоить дороже, чем сама выдача. Для внешних API часто достаточно диапазона, например «более 10 000 результатов», или вообще отказа от total в пользу следующего курсора. Клиент переживет. Прод — тоже.
Авторизация: API keys, JWT, OAuth 2.0, OIDC
Выбор схемы авторизации зависит не от моды, а от того, кто ваш клиент и какие риски вы готовы нести. Для REST API нет универсального ответа: ключи удобны для сервер-сервер интеграций, JWT хорошо ложатся на stateless-проверку, OAuth 2.0 нужен для делегированного доступа, а OIDC закрывает слой аутентификации пользователя.
Когда хватает API keys
API key — это самый дешевый в запуске вариант. Он подходит для внутренних сервисов, простых B2B-интеграций, системных webhook'ов и сценариев, где один клиент получает доступ к заранее определенному набору операций. Но ключи плохо масштабируются по безопасности: их сложно гранулярно ограничивать, трудно безопасно показывать повторно и легко утекать в логи, curl-history и фронтенд.
Если используете ключи, закладывайте базовую гигиену:
- префиксы вроде
sk_live_иsk_test_для разделения сред; - хэшированное хранение вместо открытого текста;
- rotation без простоя;
- ограничение по IP, scope, проекту и сроку действия.
JWT: полезный инструмент, не магический амулет
JWT удобен, когда ресурсный сервер должен быстро проверять токен локально. Но проблема в том, что команды часто начинают складывать в него все подряд: права, профили, фичефлаги, половину CRM и, видимо, детские травмы продукта. Нормальный access token должен быть короткоживущим: часто 5-15 минут для чувствительных операций и 15-60 минут для стандартных API-сценариев.
Если выдают refresh token, он требует отдельной защиты: ротации, привязки к клиенту, отзывов, аудита. С января 2025 года OAuth 2.0 Security BCP формализует более жесткие практики: implicit flow фактически выведен из безопасных рекомендаций, PKCE нужен не только мобильным, а sender-constrained токены через DPoP или mTLS становятся все более зрелой опцией для высокорисковых систем.
OAuth 2.0 и OIDC: где начинается зрелая экосистема
| Схема | Сценарий | Что учесть |
|---|---|---|
| API key | Сервер-сервер, простые интеграции | Rotation, scopes, не класть в URL |
| JWT Bearer | Внутренние сервисы, SPA + backend | Короткий TTL, отзыв, clock skew |
| OAuth 2.0 | Делегированный доступ сторонних приложений | Authorization Code + PKCE |
| OIDC | Логин пользователя и identity claims | ID Token не равен access token |
Главная практическая мысль: не используйте OAuth 2.0 просто потому, что он «enterprise». Если у вас три системных клиента и один backend, ключей или service tokens достаточно. Но если к вашей платформе подключаются внешние приложения, партнеры и разные типы пользователей, без нормального провайдера авторизации вы быстро увязнете в самодельной криптографии.
Версионирование API
Версионирование — это не украшение документации, а способ пережить эволюцию продукта без массового падения клиентов. Ошибка здесь обычно одна из двух: либо версию добавляют везде и навсегда, либо живут в режиме «мы ничего не ломаем», пока однажды не ломают всех сразу. Для REST API рабочая стратегия почти всегда гибридная: мелкие совместимые изменения идут без новой версии, несовместимые — через явно отделенный контракт.
Что считается breaking change
- Удаление поля из ответа.
- Изменение типа поля, например
stringвobject. - Смена обязательности параметра.
- Изменение семантики статуса ответа.
- Переименование endpoint'а или query-параметра.
Добавление нового необязательного поля обычно обратно совместимо. Но даже здесь есть нюанс: если клиенты парсят JSON жестко и падают на неизвестных полях, у вас проблема не столько в API, сколько в качестве клиентов.
Где держать версию
Самые частые варианты — в URL, в заголовке или в media type. На практике URL-версионирование остается самым понятным для внешних интеграций: /v1/orders, /v2/orders. Оно легко читается, хорошо маршрутизируется и нормально переживает корпоративную реальность, где API дебажат в браузере, Postman и nginx-конфигах.
| Подход | Плюсы | Минусы |
|---|---|---|
| Версия в URL | Прозрачно, просто маршрутизировать | URL разрастаются, сложнее делать «мягкую» эволюцию |
| Версия в заголовке | Чище URI | Хуже дебажить вручную |
| Версия в media type | Архитектурно аккуратно | Сложнее для большинства команд и клиентов |
Практика депрекации
Нормальный жизненный цикл версии выглядит так: объявили новую, дали migration guide, пометили старую как deprecated, начали слать предупреждения в заголовках и логи клиента, через 6-12 месяцев выключили. Для публичных API крупных платформ окно может быть длиннее — 12-24 месяца. Для внутренних систем часто достаточно 2-6 месяцев, если есть контроль над всеми потребителями.
Полезные приемы:
- дата sunset в документации и в заголовках ответа;
- отдельный changelog по версиям;
- контрактные тесты на старую и новую версии параллельно;
- метрики потребления по версиям, иначе вы не знаете, кого ломаете.
Если breaking change'ов много и они случаются каждые 2-3 месяца, проблема не в отсутствии версии. Проблема в том, что контракт выпускают раньше, чем о нем договорились внутри компании.
Errors: формат, idempotency, rate limit
Ошибка в API должна помогать клиенту исправить поведение, а не вызывать желание открыть wireshark и уйти в лес. В 2026 году уже странно видеть хаотичные ответы вида {"error":"something went wrong"}. Для REST API имеет смысл опираться на стандартный формат problem details из RFC 9457: это предсказуемая структура с типом проблемы, заголовком, деталями и идентификатором конкретного инцидента.
Какой формат ошибки стоит принять за базовый
Минимальный полезный набор полей:
type— URI типа проблемы;title— короткий заголовок;status— HTTP-статус;detail— человеческое объяснение;instance— идентификатор конкретного случая или request ID.
Для валидации часто добавляют массив ошибок с указанием поля, JSON Pointer или path. Это особенно полезно в формах и SDK, где нужно подсветить точный источник проблемы, а не просто сообщить «данные не такие».
Idempotency: спасение от дублей в платежах и не только
Идемпотентность особенно важна для операций создания и списания денег. Если мобильный клиент не получил ответ из-за таймаута, он почти наверняка попробует еще раз. Без Idempotency-Key вы легко получаете двойной заказ, двойное списание, двойную отправку письма и тройной вопрос от финдиректора.
Обычно ключ идемпотентности живет от 24 до 72 часов. Для платежных сценариев некоторые команды держат окно 7 дней, но это уже компромисс между безопасностью и стоимостью хранения. Важное правило: один и тот же ключ должен использоваться только с тем же телом запроса. Если payload изменился, сервер должен вернуть конфликт, а не молча принять новый смысл под старым ключом.
Rate limit и защита от шумных клиентов
Базовый ответ при превышении лимита — 429 Too Many Requests. Помимо статуса, клиенту нужны метаданные: сколько осталось, когда можно повторить, какой лимит действует. На практике экосистема все еще встречает как старые X-RateLimit-* заголовки, так и более новые стандартизованные подходы с RateLimit и RateLimit-Policy.
- Лимит на пользователя: например, 60-600 запросов в минуту.
- Лимит на IP: полезно для анонимных endpoint'ов.
- Отдельный лимит на дорогие операции: 5-20 в минуту.
Retry-Afterдля предсказуемого поведения клиента.
Не пытайтесь замаскировать rate limit под 403 или общую ошибку. Клиент должен понимать, что проблема временная и ее можно обрабатывать автоматически.
Документация: OpenAPI, Swagger, Postman
Если документация живет отдельно от контракта, она почти гарантированно врет. Лучший путь в 2026 году — хранить описание API как артефакт сборки и процесса разработки. Для REST API де-факто стандартом остается OpenAPI. На май 2026 года в экосистеме доступны OAS 3.1.x и уже опубликована ветка 3.2.0, но для большинства production-команд зрелым компромиссом остается 3.1: она совместима с современным JSON Schema и нормально поддерживается инструментами.
Что дает OpenAPI на практике
- единый контракт для backend, frontend, QA и партнеров;
- генерацию SDK и моков;
- валидаторы запросов и ответов;
- контрактные тесты в CI;
- машиночитаемый changelog между версиями.
Swagger сегодня стоит понимать как набор инструментов вокруг спецификации: Swagger UI, Editor, codegen-экосистема. Саму спецификацию давно правильно называть OpenAPI, и путаницу лучше не тащить в архитектурные документы.
Что обязательно описывать, кроме happy path
Плохая документация почти всегда красива и бесполезна. Она показывает один пример успешного запроса и стыдливо молчит про ошибки, лимиты, пагинацию, дедупликацию и политику sunset. Полезная документация должна включать:
- схемы ошибок для 4xx и 5xx;
- правила фильтрации и сортировки с примерами;
- способы авторизации по каждому сценарию;
- ограничения rate limit;
- webhook events и политику повторной доставки;
- примеры для sandbox и production.
Где место Postman и когда его мало
Postman хорош как клиентская коллекция, sandbox для интегратора и инструмент быстрого smoke-тестирования. Он особенно полезен на ранних этапах, когда нужно показать сценарии руками. Но если команда подменяет им спецификацию, начинаются проблемы: коллекции хуже выражают контракт, сложнее сравниваются между версиями и не всегда синхронны с реализацией.
Рабочая связка обычно такая:
- OpenAPI как источник истины.
- Swagger UI или Redoc для читаемой справки.
- Postman-коллекции, сгенерированные из контракта или регулярно синхронизируемые с ним.
И да, документацию нужно версионировать вместе с API. Иначе миграционный ад наступает раньше, чем релиз-ноты успевают доехать до клиентов.
Безопасность REST: OWASP API Top 10
Безопасность API в 2026 году — это уже не только про токены и TLS. По версии OWASP API Security Top 10 2023, верхние позиции по-прежнему занимают проблемы авторизации и управления доступом к объектам. Для REST API это болезненно знакомо: endpoint может быть «правильно защищен» на уровне входа, но все равно позволять читать чужие заказы по соседнему ID.
Что в списке рисков встречается чаще всего
Актуальная десятка OWASP включает Broken Object Level Authorization, Broken Authentication, Broken Object Property Level Authorization, Unrestricted Resource Consumption, Broken Function Level Authorization, Unrestricted Access to Sensitive Business Flows, SSRF, Security Misconfiguration, Improper Inventory Management и Unsafe Consumption of APIs.
Перевод на человеческий язык довольно приземленный:
- проверяйте доступ не только к endpoint'у, но и к конкретному объекту;
- не отдавайте лишние поля из модели «просто потому что они есть»;
- ограничивайте тяжелые запросы по CPU, памяти, числу записей и частоте;
- ведите инвентаризацию версий, хостов, тестовых и забытых endpoint'ов.
Четыре меры, которые дают лучший ROI
- Object-level authorization. Каждая операция над объектом должна перепроверять владельца, роль, tenant и допустимый scope.
- Schema allowlist. Явно описывайте, какие поля можно читать и менять. Mass assignment по-прежнему ломает больше систем, чем хотелось бы.
- Resource quotas. Лимитируйте размер body, глубину фильтров, количество элементов в массиве, page size и время выполнения.
- Asset inventory. Держите список версий, доменов, deprecated route'ов, sandbox-окружений и webhook endpoints.
Частые промахи команд
Самый банальный — считать, что API gateway решает все. Он может проверить токен, но не знает, имеет ли пользователь доступ к объекту invoice_7842. Второй промах — отдавать в ответе внутренние поля: служебные флаги, чужие tenant ID, e-mail персонала, технические статусы антифрода. Третий — забывать о внешних API как о поверхности атаки: если ваш сервис без валидации доверяет стороннему провайдеру, вы уязвимы не меньше, чем при прямом пользовательском вводе.
В безопасности API выигрывает не команда с самым громким Zero Trust в презентации, а команда, которая последовательно режет поверхность атаки на уровне контракта, кода и эксплуатации.
Когда выбрать GraphQL или gRPC
Нормальный вопрос сегодня звучит не «REST или GraphQL/gRPC», а «какой интерфейс лучше решает конкретную задачу». REST API по-прежнему универсален, но не обязан быть единственным стилем в системе. Если у клиента сложные графы зависимых данных, а у внутренних сервисов высокие требования к latency и стримингу, смешанная архитектура часто рациональнее единой догмы.
Когда выигрывает GraphQL
GraphQL особенно хорош для фронтенд-команд, которым нужно за один запрос получать набор связанных данных и контролировать состав полей. Это типичный сценарий для сложных кабинетов, мобильных приложений, marketplace-интерфейсов, BFF-слоя над несколькими источниками. Он уменьшает over-fetching и under-fetching, но взамен требует дисциплины в схеме, резолверах, кэшировании и защите от слишком дорогих запросов.
Если команда еще не умеет считать стоимость запросов, ограничивать глубину и решать N+1, GraphQL быстро превращается в дорогой конструктор проблем.
Когда выигрывает gRPC
gRPC имеет смысл внутри организации, когда важны:
- строгий контракт через Protocol Buffers;
- низкая задержка и компактный бинарный формат;
- стриминг в одну или обе стороны;
- генерация клиентов для множества языков;
- высокая интенсивность межсервисного трафика.
Он особенно уместен в микросервисах, ML-pipelines, real-time сервисах, телеметрии и внутренних платформах с десятками сервисных вызовов на одну пользовательскую операцию. Но для публичных интеграций gRPC сложнее: браузерная совместимость ограниченнее, отладка руками хуже, а порог входа для партнеров выше.
Быстрая матрица выбора
| Сценарий | Лучший старт | Почему |
|---|---|---|
| Публичный B2B API | REST | Проще интегрировать и поддерживать |
| BFF для сложного фронтенда | GraphQL | Гибкая выборка и агрегация данных |
| Внутренний high-throughput сервис | gRPC | Производительность и строгий контракт |
| Событийная интеграция | Webhooks или очередь | Не нужно опрашивать сервер |
Если коротко: для внешних интеграций безопаснее ошибиться в сторону простоты, а не в сторону технологического максимализма. Большинству компаний не нужно «убить REST». Им нужно перестать делать плохо спроектированные API под его вывеской.
Глубже на тему — исследования it-institute.ru
На партнёрском портале it-institute.ru опубликована подборка релевантных исследований с медианами, выборками и методологией:
- AI в разработке ПО: реальное внедрение
- Карта вендоров: DevTools и CI/CD
- Platform Engineering vs DevOps
Партнёрские проекты
FAQ о REST API
REST и RESTful — это одно и то же?
Почти, но не совсем. REST — архитектурный стиль, а RESTful обычно называют интерфейсы, которые ему в значительной степени следуют. На практике термин используют свободно, но важно не путать его с «любой JSON по HTTP».
Нужно ли всегда ставить версию в URL?
Не обязательно, но для внешних интеграций это самый понятный вариант. Если команда зрелая и умеет жить с версией в заголовках, можно так, но выигрыш обычно меньше, чем сложность поддержки.
Когда выбирать PATCH, а когда PUT?
PUT подходит для полной замены ресурса, PATCH — для частичного изменения. Если клиент отправляет только измененные поля, безопаснее и понятнее использовать PATCH.
Какой размер page size считать нормальным?
Для большинства публичных API разумный диапазон — 20-100 элементов по умолчанию и максимум 100-500, если данные легкие. Более крупные страницы часто вредят latency и памяти сильнее, чем помогают клиенту.
Можно ли использовать JWT без OAuth 2.0?
Да, если у вас простая схема доверия между сервисами или собственная аутентификация. Но JWT сам по себе не решает вопросы делегирования доступа, отзывов токенов и согласованной экосистемы клиентов.
Что лучше для ошибок: свой JSON-формат или Problem Details?
Если нет сильной причины изобретать свое, берите Problem Details из RFC 9457. Он снижает хаос, понятен инструментам и дает предсказуемую структуру для SDK, логирования и поддержки.
Когда REST API уже не лучший выбор?
Когда клиенту постоянно нужны сложные связанные графы данных, либо когда внутренний трафик требует бинарного контракта, стриминга и минимальной задержки. В таких случаях обычно выигрывают GraphQL или gRPC, а не попытка натянуть все требования на один стиль.
Следите за обновлениями itech-news.ru — мы держим эту страницу актуальной.
