OpenAPI (Swagger)
OpenAPI (Swagger)
OpenAPI — это машиночитаемое описание HTTP-API: какие адреса есть, что они принимают, что отвечают, как проверять аутентификацию. Раньше называлось Swagger. Файл на YAML или JSON, единый для всех клиентов и серверов.
История
История OpenAPI — это ровно та история, где инженерное решение переросло автора и стало общей нормой.
Начало — 2010 год, США. Разработчик по имени Тони Там (Tony Tam) делал в компании Wordnik (проект-словарь) внутренний инструмент, чтобы описывать их REST-API одним файлом. Проект назывался Swagger и был из двух частей: спецификация (формат JSON, как описывать API) и Swagger UI (веб-страничка, которая читает этот файл и рисует красивую документацию с кнопкой «попробовать»). Он выложил всё в открытый доступ на GitHub.
Идея выстрелила потому, что попала в больной нерв эпохи. Начало 2010-х — расцвет REST-API: все делали микросервисы, все делали мобильные приложения к своим бэкендам, все делали публичные API для сторонних разработчиков. И у всех была одна и та же проблема: как поддерживать документацию в актуальном состоянии, чтобы она не отставала от реального кода. Swagger отвечал: не поддерживайте руками, храните описание одним файлом и генерируйте документацию, клиентов и заглушки из него.
Дальше — 2015 год. Swagger покупает компания SmartBear (они делают тестировочные инструменты). И через несколько месяцев SmartBear передаёт спецификацию под крыло Linux Foundation, создаётся OpenAPI Initiative — консорциум, куда сразу входят Google, Microsoft, IBM, PayPal, Atlassian и другие. Именно тогда спецификация переименовывается: сам стандарт теперь OpenAPI Specification (OAS), а имя Swagger остаётся у инструментов (Swagger UI, Swagger Editor, Swagger Codegen).
Вехи развития:
- Swagger 1.0 — 2011. Первая публичная версия. Только JSON.
- Swagger 2.0 — 2014. Стало можно писать в YAML (человек читает легче). Именно с этой версии инструмент начал становиться отраслевым стандартом.
- OpenAPI 3.0 — 2017. Первое переименование под эгидой Linux Foundation. Разделили описание тела запроса и ответа, добавили нормальную работу с несколькими типами контента и несколькими схемами авторизации сразу.
- OpenAPI 3.1 — 2021. Ключевой шаг: спецификация стала совместимой с JSON Schema 2020-12. До этого у OpenAPI было своё «почти как JSON Schema, но не совсем», и это раздражало всех, кто пытался переиспользовать схемы из других мест.
- OpenAPI 3.2 — 2025. Дошлифовка. Улучшили описание веб-хуков, стриминга и не-JSON форматов.
Кто владеет стандартом сегодня — OpenAPI Initiative (openapis.org), это некоммерческий проект Linux Foundation. Спецификация свободная, лицензия Apache 2.0. Инструменты — частично тоже открытые (Swagger UI, Redoc, openapi-generator), частично коммерческие (SwaggerHub от SmartBear).
Что это такое
Представь, что у тебя есть HTTP-сервис. Он умеет отвечать на десяток адресов: GET /users, POST /users, GET /users/{id}, и так далее. Чтобы этим сервисом кто-то мог пользоваться, нужно рассказать миру:
- какие адреса есть,
- какие параметры они принимают (в URL, в query-строке, в теле запроса, в заголовках),
- какого формата тело запроса (JSON с какими полями? какие обязательны? какие типы?),
- что вернётся в ответе (JSON какой структуры для успеха, для ошибки 404, для ошибки 500),
- как аутентифицироваться (нужен Bearer-токен, или API-ключ в заголовке, или OAuth 2.0).
OpenAPI — это способ рассказать всё это одним файлом, в машиночитаемом виде. Открываешь openapi.yaml, а там:
openapi: 3.1.0
info:
title: Users API
version: 1.2.0
paths:
/users/{id}:
get:
summary: Получить пользователя по id
parameters:
- name: id
in: path
required: true
schema:
type: integer
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'404':
description: Не найден
components:
schemas:
User:
type: object
required: [id, email]
properties:
id:
type: integer
email:
type: string
format: email
name:
type: string
Это описание — контракт. Оно говорит: сервис обязуется принимать такие запросы и отвечать такими телами. И одновременно оно машиночитаемое — то есть по нему автоматически строятся: документация (Swagger UI, Redoc), клиентские библиотеки на любом языке (openapi-generator), моки для тестов, валидация входящих запросов на сервере, коллекции в Postman.
Чем отличается от похожих вещей.
- OpenAPI vs просто документация в Markdown. Markdown читает человек. OpenAPI читает машина: она может сгенерировать по нему код и проверить, что реальный ответ сервиса совпадает с описанным.
- OpenAPI vs GraphQL SDL. GraphQL Schema Definition Language описывает GraphQL-схему (один эндпоинт, гибкие запросы). OpenAPI описывает REST (много эндпоинтов, каждый со своим фиксированным ответом). Это два разных подхода к API, а не два способа описать одно и то же.
- OpenAPI vs Protobuf/gRPC. Protobuf — язык описания сообщений и удалённых вызовов для gRPC. Тоже машиночитаемо, тоже генерирует код, но привязано к бинарному протоколу gRPC. OpenAPI — про обычный HTTP-API с JSON-телами.
- OpenAPI vs JSON Schema. JSON Schema описывает форму одного JSON-документа. OpenAPI описывает целый HTTP-сервис и внутри использует JSON Schema для описания тел запросов и ответов. С версии 3.1 это одна и та же JSON Schema, полностью совместимая.
Аналогии из жизни
Меню в ресторане. OpenAPI — это меню сервиса. В меню написано: «Комбо №3: две котлеты, картошка, соус на выбор — томатный или горчичный, 480 рублей». Гость (клиент API) заранее знает, что можно заказать и что придёт в тарелке. Официант (сервер) не имеет права принести пельмени вместо котлет — контракт.
Где ломается. В меню нельзя описать логику: «если сегодня пятница, то мороженое бесплатно». В OpenAPI тоже нельзя описать бизнес-правила — только форму запроса и ответа. То, что должно случиться внутри, остаётся на честном слове разработчика.
Спецификация розетки евростандарта. Есть стандарт CEE 7/4: два круглых штыря, заземление сверху, 230 вольт, 50 герц. Любой производитель вилок и розеток по всему миру знает точно, что и где должно быть. Ты покупаешь фен в одном магазине, розетку в другом — они совпадают, потому что оба соответствуют одному стандарту. OpenAPI — это такая же розетка, только для программ.
Где ломается. Розетка ничего не говорит про то, что через неё потечёт. Она гарантирует форму — но фен, стиральная машина и лампочка ведут себя очень по-разному. OpenAPI гарантирует, что тело запроса пройдёт валидацию, но не гарантирует, что бэкенд сделает то, что ты ожидаешь семантически.
Договор поставки в бизнесе. В договоре прописано: поставщик поставляет 100 коробок такого-то артикула, к такому-то числу, по такой-то цене, оплата в течение 15 дней после отгрузки, любые изменения — приложением. Обе стороны знают, чего ждать; в случае спора — разбираются по договору. OpenAPI — тот же договор, только между двумя сервисами: клиент шлёт вот такое, сервер отвечает вот таким, срок ответа не оговорён, версия 1.2.0.
Где ломается. Договор поставки заверен подписями и юридически обязывает. OpenAPI сам по себе никого ни к чему не обязывает: если разработчик пишет одно в файле, а делает в коде другое — до момента, пока никто автоматически не сверил, обе стороны об этом даже не узнают.
Как это работает
По шагам, как всё это устроено на практике.
Шаг 1. Пишется файл спецификации. Обычно openapi.yaml или openapi.json. Внутри — три главных блока:
info— что за API, версия, лицензия.paths— список всех адресов и методов (GET, POST, PUT, DELETE, PATCH). Для каждого — параметры, тело, возможные ответы.components— переиспользуемые куски: схемы объектов (те самые тела в JSON), схемы аутентификации, стандартные ответы для ошибок.
Шаг 2. Файл валидируется. Есть валидаторы (Spectral, openapi-cli), которые проверяют, что вы написали корректный OpenAPI, что нет пропущенных обязательных полей, что все $ref — ссылки на существующие места, что схемы соответствуют JSON Schema. Обычно это встраивается в CI (continuous integration — автоматическая проверка при каждом коммите): не проходит проверку — не мержим.
Шаг 3. Из файла генерируется всё, что можно генерировать.
- Документация. Инструмент вроде Swagger UI или Redoc берёт
openapi.yamlи превращает в HTML-страницу с интерактивным описанием: каждый эндпоинт, поля, примеры, кнопка «попробовать» прямо из браузера. - Клиентский код. openapi-generator умеет из одного файла сгенерировать библиотеки на 60+ языках (Python, TypeScript, Go, Rust, Java, Swift...). Ты пишешь на бэкенде — фронтенд получает клиента бесплатно.
- Серверные заглушки (stubs — «пеньки»). По спецификации можно сгенерировать пустой каркас сервера, куда останется только вписать бизнес-логику. Так работает contract-first подход: сначала контракт, потом код.
- Моки (mocks — заглушки, имитирующие настоящий сервер). Инструменты вроде Prism поднимают фейковый сервер по спецификации: он отвечает примерами из файла. Фронтенд может параллельно разрабатывать интерфейс, пока бэкенд ещё не готов.
- Тесты. Есть библиотеки, которые проверяют реальные ответы бэкенда на соответствие OpenAPI. Ошибся в коде — сломался тест.
- Импорт в Postman. Открываешь Postman,
Import → OpenAPI, и получаешь готовую коллекцию всех запросов с примерами.
Шаг 4. Спецификация живёт вместе с кодом. Есть две философии, и они спорят.
- Design-first. Сначала команда пишет OpenAPI-файл, обсуждает контракт, только потом кто-то садится реализовывать. Плюс — не будет неожиданностей, все договорились заранее. Минус — медленно, много ручной работы.
- Code-first. Разработчик пишет код с аннотациями (в Python через FastAPI, в Java через Spring Boot, в Go через swaggo), фреймворк сам генерирует
openapi.jsonна лету. Плюс — быстро, спецификация всегда совпадает с кодом. Минус — сложно приступить к обсуждению API до того, как хоть что-то написано.
На практике часто гибрид: пишут код с аннотациями (code-first), но спецификация после генерации становится тем самым файлом, по которому потом все синхронизируются.
Шаг 5. Клиенты используют. Мобильный разработчик, фронтендер, сторонний интегратор — они не читают ваш код на бэкенде. Они открывают Swagger UI, читают, что можно, генерируют клиента под свой язык и начинают работать.
Схематично весь цикл:
разработчик пишет код + аннотации
↓
фреймворк генерирует openapi.json
↓
├── Swagger UI → люди читают доку
├── openapi-generator → клиентские SDK
├── Prism → мок-сервер для тестов
└── валидатор в CI → проверка при каждом коммите
Где встречается в обычной жизни
- Ты открываешь сайт банка, нажимаешь «оплатить ЖКХ», выбираешь поставщика — под капотом фронтенд стучится в API банка. Форма ввода лицевого счёта, подсказки, проверка суммы — всё это описано в OpenAPI-контракте между фронтом и бэком банка.
- Ты пользуешься приложением такси или доставки — приложение отправляет в бэкенд координаты, номер, промокод. Каждое такое поле описано в спецификации, и если приложение обновляется до новой версии, а спецификация не изменилась — старая версия продолжает работать.
- Ты покупаешь билет на самолёт через агрегатор (Aviasales, Skyscanner) — агрегатор дёргает API десятков авиакомпаний. У каждой из них — своя спецификация. Именно чтобы не разбираться с каждой поштучно, придумали стандарты типа NDC (это уже надстройка над OpenAPI-подобной идеей).
- Ты подключаешь Telegram-бота — весь Bot API у Telegram документирован. И хотя официально это не OpenAPI-файл, сообщество давно сделало неофициальный
openapi.json— по нему клиенты бота генерируют.
Где встречается в IT и бизнесе
- Интеграции с внешними системами. У Пашиной работы это калтрекинг, CRM, аналитика. Каждый нормальный вендор публикует OpenAPI-файл или Swagger UI. Открываешь — сразу видишь, какие данные вытаскивать и какие форматы аутентификации есть.
- Внутренняя разработка микросервисов. Компания разбивает большой продукт на 20 сервисов. Каждый сервис хранит свой
openapi.yaml. Другой команде для интеграции достаточно этого файла — не нужно читать чужой код, звать на встречу, разбираться в чужом фреймворке. - Публичные API продуктов. Stripe, Twilio, GitHub, Yandex.Cloud, Cloudflare — у всех есть OpenAPI-спецификации. Многие открыты и лежат прямо в их гитхабе. По ним каждый разработчик может собрать себе клиента и не ждать, пока вендор выпустит SDK на его язык.
- Contract testing (тестирование по контракту). Между двумя сервисами договариваются об OpenAPI. Тесты проверяют: обе стороны соблюдают контракт. Если бэкендер собрался что-то поменять — тесты падают до того, как ломает продакшн.
- API-gateway. У больших систем перед сервисами стоит шлюз (Kong, Tyk, AWS API Gateway). Он использует OpenAPI-файлы, чтобы знать, какие эндпоинты пробрасывать, где применять rate-limit, где авторизацию.
Кто пользуется
Проще перечислить, кто не пользуется. Но конкретно:
- Stripe (платежи) — их OpenAPI-файл открыт, лежит на github.com/stripe/openapi. По нему собраны официальные SDK Stripe на всех языках.
- GitHub — GitHub REST API описан OpenAPI-файлом, тоже открытым. Огромный документ, ~200 000 строк YAML.
- Twilio, PayPal, Adyen, Plaid, Datadog, DigitalOcean — все выкладывают спецификации в открытый доступ.
- Kubernetes — весь его API описан OpenAPI-спекой, и
kubectl(главный клиент) генерируется прямо из неё. - Российские сервисы. Yandex.Cloud, Selectel, Timeweb, Ozon (для маркетплейсовых интеграций), Wildberries — у всех спецификации либо в открытом доступе, либо у партнёров по запросу.
- Государство. ЕПГУ (Госуслуги) и СМЭВ используют смесь SOAP-старого и REST-нового, у нового — постепенно появляется OpenAPI. В открытых банковских API (Open Banking, аналог PSD2 в Европе) OpenAPI обязателен по стандарту.
Масштаб: по данным сайта openapis.org и опросам SmartBear, более 75% публичных REST API в мире описаны в OpenAPI, и это доля растёт каждый год.
Альтернативы и конкуренты
RAML (RESTful API Modeling Language). Появился в 2013 у MuleSoft, тоже YAML, тоже про REST. Плюсы: чуть более удобный синтаксис в спорах фанатов, хорошо работает с тем, что называет modularity. Минусы: комьюнити почти умерло, MuleSoft купили Salesforce, инструментов сильно меньше, чем у OpenAPI.
API Blueprint. От Apiary (тоже куплены Oracle). Пишешь на упрощённом Markdown, получаешь спецификацию. Плюсы: приятно писать, понятно людям. Минусы: почти умер, Apiary давно не развивается, экосистема — маленькая.
gRPC + Protobuf. Не альтернатива в лоб, а другой подход. Плюсы: бинарный протокол — быстрее и компактнее, чем JSON; типизация сильнее; на нём удобно делать серверные и клиентские стримы. Минусы: не работает из браузера напрямую (нужен gRPC-Web-шлюз), сложнее отлаживать (бинарь нельзя прочитать глазами), не выйдет просто ткнуть в него из curl'а.
GraphQL + SDL. Тоже другой подход. Плюсы: один эндпоинт, клиент сам решает, какие поля запрашивать — не нужно делать десять разных методов «дай мне пользователя без адресов». Минусы: сложнее кэшировать (HTTP-кэши не понимают GraphQL), сложнее с авторизацией на уровне полей, тяжелее выучить.
AsyncAPI. Не конкурент, а сосед: тот же принцип, только для событийных систем (Kafka, RabbitMQ, WebSocket). Родственная спецификация — тот же YAML, похожая структура. Если у тебя стриминг событий и запрос-ответ одновременно — держишь оба файла.
Когда НЕ стоит использовать
- Крошечный внутренний скрипт, который сам себя вызывает. Если у тебя один-единственный сервис, никаких внешних клиентов, вся команда сидит рядом — OpenAPI-файл станет очередной штукой, которую нужно поддерживать в актуальном состоянии, а пользы принесёт мало.
- API живёт короче месяца. Хакатон, разовый прототип, эксперимент — вложение времени в спецификацию окупится только на дистанции.
- Слишком динамичный контракт. Если ответ вашего API — это, условно, «отдай мне то, что ты сегодня насчитал» и там каждый раз новая форма — OpenAPI сможет описать это только как «object без строгой схемы», и вся ценность типизации пропадёт. В таких случаях либо JSON Schema сам по себе, либо GraphQL с гибкостью, либо просто честное текстовое описание.
Связанные понятия
- REST (Representational State Transfer) — архитектурный стиль, для которого OpenAPI и создавался. HTTP-адреса как ресурсы, методы (GET/POST/PUT/DELETE) как операции над ними.
- JSON Schema — стандарт описания формы JSON-документа. С OpenAPI 3.1 полностью совместим и переиспользуется внутри спецификации.
- Swagger UI / Redoc — веб-инструменты, которые читают OpenAPI и превращают в красивую HTML-документацию с примерами и «песочницей».
- openapi-generator — утилита командной строки, которая по спецификации генерирует клиентские и серверные SDK на десятках языков.
- Contract-first — подход к разработке, когда сначала пишется контракт (OpenAPI-файл), а код появляется после и должен ему соответствовать.
- API-first — более широкая идея: API рассматривается как основной продукт компании, а сайт и приложение — просто его клиенты; OpenAPI-спецификация становится главным артефактом.
Литература и источники
- Официальный сайт спецификации: openapis.org — свежая версия стандарта, список членов инициативы, ссылки на инструменты.
- Wikipedia — статья «OpenAPI Specification» на английской википедии даёт краткую и точную историческую справку. По-русски — статья «Swagger».
- Книга «Designing Web APIs» — Brenda Jin, Saurabh Sahni, Amir Shevat (O’Reilly, 2018, en). Не только про OpenAPI, но много практики по проектированию контрактов.
- Книга «Design and Build Great Web APIs» — Mike Amundsen (Pragmatic Bookshelf, 2020, en). Как проектировать API в контрактном подходе, с примерами на OpenAPI и ALPS.
- GitHub-репозиторий стандарта: github.com/OAI/OpenAPI-Specification — там же примеры файлов и обсуждения будущих версий. Полезно посмотреть, как выглядит «настоящая» спецификация в маленьком примере.
- Swagger Petstore — учебный пример спецификации от команды Swagger, идёт вместе с Swagger UI. Google по запросу «swagger petstore openapi».
Где встретилось у меня
Вчера в одном из моих проектов пришлось диагностировать доступ к внешней аналитической платформе. Их API отвечал «нет доступа» на нужный метод отчётов, и первое, куда я полез, — это их OpenAPI-описание: чтобы точно знать, какой формат запроса они ждут, какие параметры обязательны, какие метрики и категории существуют. Именно из спецификации я вытащил точную схему запроса getReport и построил диагностический скрипт, который бил по всем возможным точкам входа. Без OpenAPI пришлось бы гадать по обрывкам документации в PDF.
Краткое резюме
- OpenAPI — это машиночитаемое описание HTTP-API в YAML или JSON. До 2015 года звалось Swagger.
- Файл — контракт: описывает адреса, параметры, тела, ответы, аутентификацию. По нему автоматически строятся документация, клиенты, тесты, моки.
- Владеет стандартом OpenAPI Initiative под крышей Linux Foundation. Спецификация свободная, инструментов и коммерческих, и открытых — сотни.
- Полезен там, где API живёт долго и им пользуется больше одного человека; бесполезен и вреден для одноразовых прототипов и слишком динамичных контрактов.
- Главная альтернатива по концепции — GraphQL и gRPC; в реальном мире, при работе с внешними REST-API, встретишь OpenAPI в 3 случаях из 4.