Что такое Swagger и OpenAPI: полное руководство по документированию API

← Вернуться к статьям

Введение

Вы создали отличный API. Он быстрый, надёжный, хорошо спроектированный. Но если у него нет документации — им никто не сможет пользоваться. Разработчики потратят часы на угадывание endpoint'ов, форматов запросов и типов ответов.

Swagger и OpenAPI решают эту проблему. Они позволяют описать ваш API в машиночитаемом формате, автоматически сгенерировать красивую документацию, клиентские SDK и даже серверные заглушки.

В этой статье вы узнаете:

📋 Содержание

Что такое Swagger

Swagger — это набор инструментов для проектирования, документирования и тестирования REST API. Swagger был создан в 2011 году компанией SmartBear и быстро стал стандартом индустрии.

Простыми словами:

Swagger — это как чертёж здания для вашего API. Архитектор рисует чертёж до строительства, и по нему все понимают, что и как устроено. Swagger позволяет «нарисовать чертёж» API до или после его создания — и каждый разработчик сразу поймёт, как им пользоваться.

Swagger включает несколько инструментов:

Что такое 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 — это язык (как 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

Основы 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:

Настройка 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-спецификации

  1. Используйте $ref — выносите схемы в components, не дублируйте
  2. Добавляйте example — примеры делают документацию понятной
  3. Описывайте ВСЕ ответы — включая ошибки (400, 401, 404, 500)
  4. Используйте tags — группируйте endpoint'ы по доменным областям
  5. Версионируйте/api/v1/, /api/v2/
  6. Валидируйте — проверяйте спецификацию линтером (spectral)
  7. Храните в Git — спецификация должна быть под контролем версий

❌ Частые ошибки

Линтинг спецификации (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 понятным для любого разработчика.

💡 Три шага для начала:

  1. Откройте Swagger Editor и опишите свой API
  2. Подключите Swagger UI к вашему проекту
  3. Изучите REST API и HTTP методы — наши подробные руководства

🎯 Импортируйте Swagger в LightBox API

У вас уже есть OpenAPI-спецификация? Импортируйте её в LightBox API за 2 минуты и получите работающий Mock API с полной документацией.

LightBox API поддерживает импорт Swagger/OpenAPI и создаёт Mock-сервер с правильными статус кодами, заголовками и телом ответа — без единой строки серверного кода.

Попробовать бесплатно →

Статья опубликована: 23 февраля 2026
Автор: LightBox API Team