← Назад к вопросам

Что такое Swagger?

2.0 Middle🔥 191 комментариев
#Браузер и сетевые технологии#Инструменты и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Swagger

Swagger (теперь официально называется OpenAPI) — это спецификация и набор инструментов для описания, документирования и тестирования REST API. Для фронтенд-разработчика Swagger важен как источник истины о том, какие endpoints доступны и как их использовать.

История и эволюция

  • Swagger — оригинальное название и спецификация (создана в 2010)
  • OpenAPI 3.0 — переименованный стандарт, принятый Linux Foundation (2017)
  • OpenAPI 3.1 — текущая версия со множеством улучшений

Термины используются как синонимы, но "OpenAPI" — это новое официальное имя.

Основное назначение для фронтенда

Swagger/OpenAPI описывает API в структурированном виде:

openapi: 3.0.0
info:
  title: PrepBro API
  version: 1.0.0
  description: API для платформы подготовки к IT-собеседованиям

servers:
  - url: https://api.prepbro.ru/api/v1
    description: Production
  - url: http://localhost:8000/api/v1
    description: Development

paths:
  /users/{userId}:
    get:
      summary: Получить пользователя
      description: Возвращает информацию о пользователе по ID
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Успешный ответ
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '404':
          description: Пользователь не найден
        '401':
          description: Не авторизован

Преимущества Swagger для фронтенда

1. Автоматическая генерация документации

Вместо того чтобы искать docs в README или Confluence, все в одном месте:

# Swagger UI доступен по адресу
https://api.prepbro.ru/docs

# RedDoc альтернатива
https://api.prepbro.ru/redoc

Визуальный интерфейс показывает:

  • Все endpoints
  • Параметры запроса
  • Примеры запросов и ответов
  • Коды ошибок
  • Схемы данных

2. Генерация клиентов

Лучший инструмент для фронтенда — openapi-generator:

# Генерируем TypeScript клиент из спецификации
npm install @openapitools/openapi-generator-cli

npx openapi-generator-cli generate \
  -i https://api.prepbro.ru/openapi.json \
  -g typescript-axios \
  -o ./src/api/generated

Результат — полностью типизированный клиент:

// Автогенерированный клиент
import { UsersApi } from './api';

const usersApi = new UsersApi();
const user = await usersApi.getUser('user-id');
// user полностью типизирован!

3. Валидация данных на лету

Dynamic imports не требуются — Swagger UI позволяет тестировать API прямо из браузера:

// Не нужно писать curl, используем UI
// 1. Открываем https://api.prepbro.ru/docs
// 2. Находим endpoint /users/{userId}
// 3. Вводим параметры
// 4. Нажимаем "Try it out"
// 5. Видим response

Типичный workflow с Swagger

Шаг 1: Бэкенд описывает API в спецификации

# FastAPI пример (автогенерирует Swagger)
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(
    title="PrepBro API",
    version="1.0.0",
    docs_url="/docs",
    openapi_url="/openapi.json"
)

class User(BaseModel):
    id: str
    name: str
    email: str
    role: str

@app.get("/api/v1/users/{user_id}", response_model=User)
async def get_user(user_id: str):
    """Получить пользователя по ID"""
    return {"id": user_id, "name": "John", "email": "john@example.com", "role": "user"}

Шаг 2: Фронтенд генерирует клиент

// Генерируем TypeScript типы и методы
npm run generate:api

// Автоматически появляется src/api/generated/index.ts

Шаг 3: Используем в компоненте

// Полностью типизировано, без any
import { useQuery } from '@tanstack/react-query';
import { usersApi } from '@/api/generated';

function UserProfile({ userId }: { userId: string }) {
  const { data: user, isLoading } = useQuery({
    queryKey: ['user', userId],
    queryFn: () => usersApi.getUser(userId),
  });

  // user.name, user.email точно существуют и типизированы
  if (isLoading) return <Loading />;
  return <div>{user?.name}</div>;
}

Инструменты для работы со Swagger

1. Swagger UI (встроено в FastAPI, Flask, Django)

// Автоматический интерфейс документации
http://localhost:8000/docs

2. ReDoc — альтернатива Swagger UI

// Более красивая документация
http://localhost:8000/redoc

3. Postman

// Импортируем OpenAPI спецификацию
// File -> Import -> URL -> https://api.prepbro.ru/openapi.json
// Все endpoints автоматически добавятся в Postman

4. Insomnia

// Аналог Postman с открытым исходным кодом
// Также поддерживает импорт OpenAPI

Практический пример интеграции

Полный workflow для фронтенд-разработчика:

// 1. Устанавливаем генератор
npm install -D @openapitools/openapi-generator-cli

// 2. Создаем конфиг openapi-generator.yaml
packageName: api
packageVersion: 1.0.0
generatorName: typescript-axios
inputSpec: https://api.prepbro.ru/openapi.json
output: ./src/api/generated

// 3. Добавляем script в package.json
{
  "scripts": {
    "generate:api": "openapi-generator-cli generate"
  }
}

// 4. Генерируем клиент
npm run generate:api

// 5. Используем в коде
import { DefaultApi } from '@/api/generated';

const api = new DefaultApi();
const users = await api.getUsers(); // полностью типизировано!

Альтернатива: TypeScript RPC (tRPC)

Если бэкенд на Node.js/TypeScript, можно использовать tRPC вместо REST + Swagger:

// Бэкенд
const router = t.router({
  users: t.procedure
    .input(z.string().uuid())
    .output(userSchema)
    .query(async ({ input }) => {
      return await db.users.findOne({ id: input });
    }),
});

// Фронтенд — полная type safety БЕЗ кодгена!
const user = await trpc.users.query(userId);
// user точно совпадает с бэкендом

Проблемы и ограничения

1. Swagger specs могут отставать от реальности

Если бэкенд не обновляет спецификацию:

// Swagger говорит: GET /users/{id}
// Но реально бэкенд вернет 400

Решение: Code-first подход (спецификация генерируется из кода).

2. Генерация кода может быть неоптимальной

// Генератор может создать неудобный API
const user = await usersApi.usersRetrieve({ userId: 'id' });
// Вместо
const user = await api.users.get('id');

Решение: Написать свой wrapper или использовать инструмент, который генерирует в стиле вашего проекта.

Лучшие практики

// 1. Версионируйте API
/api/v1/users
/api/v2/users // новая версия

// 2. Документируйте примеры
example: {
  id: "550e8400-e29b-41d4-a716-446655440000",
  name: "John Doe",
  email: "john@example.com"
}

// 3. Используйте enum для статусов
status:
  type: string
  enum: [active, inactive, blocked]

// 4. Подробно описывайте ошибки
404:
  description: Пользователь не найден
  content:
    application/json:
      schema:
        type: object
        properties:
          error: { type: string }
          error_code: { type: string }
          message: { type: string }

Итог

Swagger/OpenAPI для фронтенда:

  • Источник истины о API структуре
  • Автоматическая генерация типизированных клиентов
  • Интерактивная документация и тестирование
  • Синхронизация типов бэк- и фронтенда
  • Экономия времени на написании API интеграции

Главное преимущество: Code generation обеспечивает type safety и предотвращает баги, связанные с несоответствием фронтенда и бэкенда.