Введение
Вы создали отличный API. Он быстрый, надёжный, хорошо спроектированный. Но если у него нет документации — им никто не сможет пользоваться. Разработчики потратят часы на угадывание endpoint'ов, форматов запросов и типов ответов.
Swagger и OpenAPI решают эту проблему. Они позволяют описать ваш API в машиночитаемом формате, автоматически сгенерировать красивую документацию, клиентские SDK и даже серверные заглушки.
В этой статье вы узнаете:
- ✅ Что такое Swagger и OpenAPI (и в чём разница)
- ✅ Как написать OpenAPI-спецификацию с нуля
- ✅ Как настроить Swagger UI для вашего проекта
- ✅ Инструменты экосистемы Swagger
- ✅ Design-First vs Code-First подход
- ✅ Примеры интеграции на Node.js, Python и PHP
📋 Содержание
Что такое Swagger
Swagger — это набор инструментов для проектирования, документирования и тестирования REST API. Swagger был создан в 2011 году компанией SmartBear и быстро стал стандартом индустрии.
Простыми словами:
Swagger — это как чертёж здания для вашего API. Архитектор рисует чертёж до строительства, и по нему все понимают, что и как устроено. Swagger позволяет «нарисовать чертёж» API до или после его создания — и каждый разработчик сразу поймёт, как им пользоваться.
Swagger включает несколько инструментов:
- Swagger Editor — онлайн-редактор для написания спецификации
- Swagger UI — красивая интерактивная документация
- Swagger Codegen — генератор клиентского и серверного кода
- SwaggerHub — облачная платформа для совместной работы
Что такое OpenAPI
OpenAPI Specification (OAS) — это стандарт для описания REST API в машиночитаемом формате (YAML или JSON). Спецификация определяет структуру API: endpoint'ы, методы, параметры, тела запросов, ответы, схемы данных и авторизацию.
История: от Swagger к OpenAPI
| Год | Событие |
|---|---|
| 2011 | Создание Swagger Specification |
| 2015 | SmartBear передаёт спецификацию Linux Foundation → рождение OpenAPI Initiative |
| 2017 | Выход OpenAPI 3.0 — крупное обновление стандарта |
| 2021 | Выход OpenAPI 3.1 — полная совместимость с JSON Schema |
Swagger vs OpenAPI — в чём разница
⚠️ Частое заблуждение
Многие путают Swagger и OpenAPI. Разница простая:
- OpenAPI — это спецификация (стандарт, формат файла)
- Swagger — это набор инструментов для работы со спецификацией
Аналогия: OpenAPI — это язык (как SQL), а Swagger — инструменты (как MySQL Workbench, DBeaver).
| OpenAPI | Swagger | |
|---|---|---|
| Что это | Спецификация (стандарт) | Набор инструментов |
| Формат | YAML / JSON файл | Editor, UI, Codegen |
| Владелец | OpenAPI Initiative (Linux Foundation) | SmartBear |
| Версии | 2.0, 3.0, 3.1 | Swagger UI, Editor, Codegen |
Экосистема инструментов
Swagger Editor
Онлайн-редактор с автодополнением, валидацией и предпросмотром документации в реальном времени. Поддерживает YAML и JSON.
editor.swagger.io — бесплатный, работает в браузере.
Swagger UI
Генерирует красивую интерактивную документацию из OpenAPI-файла. Позволяет тестировать API прямо в браузере — отправлять запросы и видеть ответы.
Можно встроить в свой проект или использовать онлайн-демо.
Swagger Codegen / OpenAPI Generator
Генерирует клиентские SDK, серверные заглушки и модели данных на 50+ языках из OpenAPI-файла. OpenAPI Generator — это форк Codegen с более активным сообществом.
Альтернативы Swagger UI
- Redoc — элегантная документация с трёхколоночным дизайном
- Stoplight Elements — современная документация с try-it-out
- RapiDoc — кастомизируемый веб-компонент
Основы OpenAPI-спецификации
OpenAPI-файл описывает ваш API в формате YAML или JSON. Разберём основные блоки:
Минимальная спецификация
openapi: 3.0.3
info:
title: My API
description: Описание моего API
version: 1.0.0
servers:
- url: https://api.example.com/v1
description: Production сервер
- url: http://localhost:3000/v1
description: Локальная разработка
paths:
/users:
get:
summary: Получить список пользователей
responses:
'200':
description: Успешный ответ
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
components:
schemas:
User:
type: object
properties:
id:
type: integer
example: 42
name:
type: string
example: "Иван Петров"
email:
type: string
format: email
example: "ivan@example.com"
Структура файла
| Блок | Описание | Обязательный |
|---|---|---|
openapi |
Версия спецификации (3.0.3, 3.1.0) | Да |
info |
Название, описание, версия API | Да |
servers |
URL серверов API | Нет |
paths |
Endpoint'ы и их операции | Да |
components |
Переиспользуемые схемы, параметры, ответы | Нет |
security |
Схемы авторизации (JWT, API key, OAuth) | Нет |
tags |
Группировка endpoint'ов по категориям | Нет |
Полный пример спецификации
Полноценное описание CRUD API для пользователей:
openapi: 3.0.3
info:
title: Users API
description: API для управления пользователями
version: 1.0.0
contact:
name: API Support
email: support@example.com
servers:
- url: https://api.example.com/v1
tags:
- name: Users
description: Операции с пользователями
security:
- bearerAuth: []
paths:
/users:
get:
tags: [Users]
summary: Список пользователей
description: Получить список всех пользователей с пагинацией
parameters:
- name: page
in: query
schema:
type: integer
default: 1
- name: limit
in: query
schema:
type: integer
default: 20
maximum: 100
- name: role
in: query
description: Фильтр по роли
schema:
type: string
enum: [admin, user, moderator]
responses:
'200':
description: Список пользователей
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/User'
pagination:
$ref: '#/components/schemas/Pagination'
'401':
$ref: '#/components/responses/Unauthorized'
post:
tags: [Users]
summary: Создать пользователя
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUser'
responses:
'201':
description: Пользователь создан
content:
application/json:
schema:
$ref: '#/components/schemas/User'
headers:
Location:
schema:
type: string
description: URL созданного пользователя
'400':
$ref: '#/components/responses/BadRequest'
'409':
description: Email уже занят
/users/{id}:
get:
tags: [Users]
summary: Получить пользователя
parameters:
- $ref: '#/components/parameters/UserId'
responses:
'200':
description: Данные пользователя
content:
application/json:
schema:
$ref: '#/components/schemas/User'
'404':
$ref: '#/components/responses/NotFound'
patch:
tags: [Users]
summary: Обновить пользователя
parameters:
- $ref: '#/components/parameters/UserId'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateUser'
responses:
'200':
description: Обновлённый пользователь
content:
application/json:
schema:
$ref: '#/components/schemas/User'
delete:
tags: [Users]
summary: Удалить пользователя
parameters:
- $ref: '#/components/parameters/UserId'
responses:
'204':
description: Пользователь удалён
'404':
$ref: '#/components/responses/NotFound'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
parameters:
UserId:
name: id
in: path
required: true
schema:
type: integer
schemas:
User:
type: object
properties:
id:
type: integer
example: 42
name:
type: string
example: "Иван Петров"
email:
type: string
format: email
example: "ivan@example.com"
role:
type: string
enum: [admin, user, moderator]
example: "user"
created_at:
type: string
format: date-time
CreateUser:
type: object
required: [name, email]
properties:
name:
type: string
minLength: 2
maxLength: 100
email:
type: string
format: email
role:
type: string
enum: [admin, user, moderator]
default: user
UpdateUser:
type: object
properties:
name:
type: string
email:
type: string
format: email
role:
type: string
enum: [admin, user, moderator]
Pagination:
type: object
properties:
page:
type: integer
limit:
type: integer
total:
type: integer
total_pages:
type: integer
responses:
Unauthorized:
description: Требуется авторизация
content:
application/json:
schema:
type: object
properties:
error:
type: string
example: "Token is missing or expired"
BadRequest:
description: Некорректный запрос
NotFound:
description: Ресурс не найден
Ключевые возможности OpenAPI 3.0:
$ref— ссылки на переиспользуемые компоненты (DRY-принцип)components— единое место для схем, параметров, ответовenum— ограничение допустимых значенийrequired— обязательные поляexample— примеры для документацииsecuritySchemes— описание авторизации
Настройка Swagger UI
Swagger UI превращает YAML/JSON спецификацию в интерактивную документацию с возможностью тестирования API прямо из браузера.
Самый быстрый способ — Docker
# Запустить Swagger UI с вашей спецификацией
docker run -p 8080:8080 \
-e SWAGGER_JSON=/spec/openapi.yaml \
-v ./openapi.yaml:/spec/openapi.yaml \
swaggerapi/swagger-ui
# Откройте http://localhost:8080
Встраивание в HTML-страницу
<!DOCTYPE html>
<html>
<head>
<title>API Documentation</title>
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist/swagger-ui.css">
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"></script>
<script>
SwaggerUIBundle({
url: '/openapi.yaml',
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIBundle.SwaggerUIStandalonePreset
],
layout: 'StandaloneLayout'
});
</script>
</body>
</html>
Design-First vs Code-First
Два подхода к созданию OpenAPI-спецификации. Каждый имеет свои плюсы и минусы.
✅ Design-First
Сначала пишем спецификацию, потом код.
- API-контракт согласован до разработки
- Frontend и backend работают параллельно
- Документация всегда актуальна
- Можно сгенерировать заглушки
Когда: новый проект, командная разработка, публичный API
❌ Code-First
Сначала пишем код, спецификация генерируется из аннотаций.
- Быстрый старт — не нужно учить YAML
- Спецификация не расходится с кодом
- Подходит для существующих API
- Аннотации могут загромождать код
Когда: существующий проект, прототипирование, один разработчик
Интеграция: Node.js, Python, PHP
Node.js (Express + swagger-jsdoc)
const express = require('express');
const swaggerJsdoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const app = express();
const swaggerSpec = swaggerJsdoc({
definition: {
openapi: '3.0.3',
info: {
title: 'Users API',
version: '1.0.0',
},
servers: [{ url: 'http://localhost:3000' }],
},
apis: ['./routes/*.js'],
});
app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
/**
* @openapi
* /api/users:
* get:
* summary: Список пользователей
* tags: [Users]
* responses:
* 200:
* description: Список пользователей
* content:
* application/json:
* schema:
* type: array
* items:
* type: object
* properties:
* id:
* type: integer
* name:
* type: string
*/
app.get('/api/users', (req, res) => {
res.json([
{ id: 1, name: 'Иван' },
{ id: 2, name: 'Мария' }
]);
});
app.listen(3000, () =>
console.log('API: http://localhost:3000, Docs: http://localhost:3000/docs')
);
Python (FastAPI — встроенный Swagger)
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI(
title="Users API",
description="API для управления пользователями",
version="1.0.0"
)
class User(BaseModel):
id: int
name: str
email: str
class CreateUser(BaseModel):
name: str
email: str
users_db = [
User(id=1, name="Иван", email="ivan@example.com"),
User(id=2, name="Мария", email="maria@example.com"),
]
@app.get("/api/users", response_model=list[User], tags=["Users"])
async def get_users():
"""Получить список всех пользователей"""
return users_db
@app.post("/api/users", response_model=User, status_code=201, tags=["Users"])
async def create_user(user: CreateUser):
"""Создать нового пользователя"""
new_user = User(id=len(users_db) + 1, **user.dict())
users_db.append(new_user)
return new_user
# Swagger UI автоматически доступен: http://localhost:8000/docs
# ReDoc: http://localhost:8000/redoc
FastAPI = встроенный Swagger
FastAPI автоматически генерирует OpenAPI-спецификацию и Swagger UI из типов Pydantic-моделей и аннотаций функций. Никакой дополнительной настройки — просто запустите и откройте /docs.
PHP (Laravel + L5-Swagger)
<?php
namespace App\Http\Controllers;
/**
* @OA\Info(
* title="Users API",
* version="1.0.0",
* description="API для управления пользователями"
* )
* @OA\Server(url="https://api.example.com")
*/
class ApiController extends Controller {}
/**
* @OA\Schema(
* schema="User",
* type="object",
* @OA\Property(property="id", type="integer", example=42),
* @OA\Property(property="name", type="string", example="Иван"),
* @OA\Property(property="email", type="string", format="email")
* )
*/
class UserController extends Controller
{
/**
* @OA\Get(
* path="/api/users",
* summary="Список пользователей",
* tags={"Users"},
* @OA\Response(
* response=200,
* description="Список пользователей",
* @OA\JsonContent(
* type="array",
* @OA\Items(ref="#/components/schemas/User")
* )
* ),
* @OA\Response(response=401, description="Не авторизован")
* )
*/
public function index()
{
return response()->json(User::all());
}
/**
* @OA\Post(
* path="/api/users",
* summary="Создать пользователя",
* tags={"Users"},
* @OA\RequestBody(
* required=true,
* @OA\JsonContent(
* required={"name", "email"},
* @OA\Property(property="name", type="string"),
* @OA\Property(property="email", type="string", format="email")
* )
* ),
* @OA\Response(response=201, description="Создан")
* )
*/
public function store(Request $request)
{
$user = User::create($request->validated());
return response()->json($user, 201);
}
}
# Установка L5-Swagger для Laravel
composer require darkaonline/l5-swagger
php artisan vendor:publish --provider="L5Swagger\L5SwaggerServiceProvider"
php artisan l5-swagger:generate
# Документация: http://your-app.com/api/documentation
Генерация кода
Одно из главных преимуществ OpenAPI — автоматическая генерация кода из спецификации. Это избавляет от рутины и гарантирует соответствие клиента и сервера.
OpenAPI Generator
# Установить OpenAPI Generator
npm install @openapitools/openapi-generator-cli -g
# Сгенерировать TypeScript-клиент
openapi-generator-cli generate \
-i openapi.yaml \
-g typescript-fetch \
-o ./generated/client
# Сгенерировать серверный код на Express
openapi-generator-cli generate \
-i openapi.yaml \
-g nodejs-express-server \
-o ./generated/server
# Сгенерировать Python-клиент
openapi-generator-cli generate \
-i openapi.yaml \
-g python \
-o ./generated/python-client
Что можно сгенерировать
| Тип | Языки/фреймворки | Что генерируется |
|---|---|---|
| Клиенты | TypeScript, Python, Java, Go, Swift, Kotlin, PHP, Ruby, C# | API-классы, модели, типы, HTTP-клиент |
| Серверы | Express, Spring, Flask, Django, Laravel, Go Gin | Роутинг, контроллеры, модели, валидация |
| Документация | HTML, Markdown | Статическая документация |
⚠️ Генерация кода — не серебряная пуля
Сгенерированный код — это отправная точка, а не финальный продукт. Его нужно адаптировать: добавить бизнес-логику, настроить обработку ошибок, интегрировать с базой данных. Но шаблонный код (модели, роутинг, типы) экономит десятки часов.
Best Practices
✅ Правила хорошей OpenAPI-спецификации
- Используйте
$ref— выносите схемы вcomponents, не дублируйте - Добавляйте
example— примеры делают документацию понятной - Описывайте ВСЕ ответы — включая ошибки (400, 401, 404, 500)
- Используйте
tags— группируйте endpoint'ы по доменным областям - Версионируйте —
/api/v1/,/api/v2/ - Валидируйте — проверяйте спецификацию линтером (spectral)
- Храните в Git — спецификация должна быть под контролем версий
❌ Частые ошибки
- Спецификация разошлась с кодом — решение: CI/CD проверка или Code-First подход
- Нет примеров — документация без примеров бесполезна
- Нет описания ошибок — клиент не знает, как обрабатывать 400 и 422
- Огромный файл — разбивайте на модули через
$refк внешним файлам - Забыли про авторизацию — документируйте
securitySchemes
Линтинг спецификации (Spectral)
# Установить Spectral
npm install -g @stoplight/spectral-cli
# Проверить спецификацию
spectral lint openapi.yaml
# Пример вывода:
# openapi.yaml
# 12:5 warning operation-description Operation should have a description.
# 25:9 error oas3-valid-schema Schema must have a type.
FAQ
❓ Чем Swagger отличается от OpenAPI?
Ответ: OpenAPI — это спецификация (стандарт для описания API). Swagger — это набор инструментов для работы с этой спецификацией (Editor, UI, Codegen). До версии 3.0 спецификация называлась «Swagger Specification», затем была переименована в «OpenAPI Specification». Имя «Swagger» осталось за инструментами SmartBear.
❓ Какую версию OpenAPI использовать: 2.0 или 3.0?
Ответ: Для новых проектов — OpenAPI 3.0 или 3.1. Версия 3.0 добавила: множественные серверы, улучшенные компоненты, callbacks, links, поддержку oneOf/anyOf/allOf. Версия 3.1 — полную совместимость с JSON Schema. Версия 2.0 используется только в legacy-проектах.
❓ Можно ли сгенерировать код из Swagger-файла?
Ответ: Да. OpenAPI Generator создаёт клиентские SDK и серверный код на 50+ языках: TypeScript, Python, Java, Go, PHP, Ruby, C#, Kotlin, Swift и других. Генерируются модели данных, API-клиенты, роутинг и валидация.
# Пример: TypeScript-клиент
openapi-generator-cli generate -i api.yaml -g typescript-fetch -o ./client
❓ Нужно ли писать OpenAPI-спецификацию вручную?
Ответ: Не обязательно. Существует два подхода:
- Design-First — пишете спецификацию в Swagger Editor, затем генерируете код. Рекомендуется для новых проектов.
- Code-First — добавляете аннотации в код, спецификация генерируется автоматически. Рекомендуется для существующих проектов. FastAPI (Python) и L5-Swagger (Laravel) используют этот подход.
Заключение
📝 Сводная таблица инструментов
| Инструмент | Назначение | Цена |
|---|---|---|
| Swagger Editor | Редактирование спецификации | Бесплатно |
| Swagger UI | Интерактивная документация | Бесплатно |
| OpenAPI Generator | Генерация клиентов/серверов | Бесплатно |
| Redoc | Красивая документация | Бесплатно |
| Spectral | Линтинг спецификации | Бесплатно |
| SwaggerHub | Облачная платформа | От $0/мес |
Swagger и OpenAPI — это не просто «документация для галочки». Это полноценный инструмент проектирования, который ускоряет разработку, улучшает коммуникацию в команде и делает ваш API понятным для любого разработчика.
💡 Три шага для начала:
- Откройте Swagger Editor и опишите свой API
- Подключите Swagger UI к вашему проекту
- Изучите REST API и HTTP методы — наши подробные руководства
🎯 Импортируйте Swagger в LightBox API
У вас уже есть OpenAPI-спецификация? Импортируйте её в LightBox API за 2 минуты и получите работающий Mock API с полной документацией.
LightBox API поддерживает импорт Swagger/OpenAPI и создаёт Mock-сервер с правильными статус кодами, заголовками и телом ответа — без единой строки серверного кода.
- ✓ Импорт Swagger/OpenAPI за 2 минуты
- ✓ Автоматическое создание endpoint'ов
- ✓ Логирование всех запросов
- ✓ Бесплатный план для старта
Статья опубликована: 23 февраля 2026
Автор: LightBox API Team