OpenAPI и Swagger, версионирование API
↑ 3.3 Web API: контроллеры, Minimal API, валидация · ← Предыдущая · → Следующая
Зачем это на собесе
Про контракт и эволюцию API: как документировать и как вносить ломающие изменения.
Объяснение
OpenAPI — спецификация описания HTTP API; Swagger UI — интерфейс для просмотра/вызова. В .NET 9 встроенная генерация Microsoft.AspNetCore.OpenApi заменила Swashbuckle по умолчанию.
builder.Services.AddOpenApi();
app.MapOpenApi(); // /openapi/v1.json
// UI: Scalar или Swagger UI поверх jsonorders.MapGet("{id:guid}", Get)
.WithName("GetOrder")
.WithSummary("Получить заказ")
.Produces<OrderDto>()
.ProducesProblem(404);Версионирование
| Способ | Пример | Замечание |
|---|---|---|
| URL | /v2/orders | самый простой, видно в логах |
| Заголовок | X-Api-Version: 2 | чище URL, сложнее тестировать |
| Media type | application/vnd.app.v2+json | «строгий REST» |
| Query | ?api-version=2.0 | стандарт Asp.Versioning |
builder.Services.AddApiVersioning(o => { o.DefaultApiVersion = new(1, 0); o.ReportApiVersions = true; })
.AddApiExplorer();Ломающие и безопасные изменения
| Безопасно | Ломающее |
|---|---|
| новое необязательное поле в ответе | удаление/переименование поля |
| новый endpoint | смена типа поля, обязательности |
| новое значение enum с толерантным клиентом | смена семантики кода ответа |
Политика: объявить deprecation (заголовки Deprecation/Sunset), поддерживать N версий, тестировать контрактами.
Нюансы и подводные камни
- Генерация клиента из OpenAPI (NSwag, Kiota) ускоряет интеграции, но требует точной схемы (
Produces). - Не публикуйте Swagger на проде без необходимости или защитите его.
- Не смешивайте версии в одной модели: копируйте DTO по версиям.
- Схема без описания ошибок вводит потребителей в заблуждение.
Практика
- Подключите
AddOpenApiи Scalar, добавьте описания и примеры. - Реализуйте v1 и v2 одного endpoint и заголовки deprecation.
- Сгенерируйте типизированный клиент из схемы.
Вопросы с ответами
Чем OpenAPI отличается от Swagger?
OpenAPI — стандарт описания; Swagger — набор инструментов (UI, codegen) для него.
Как версионировать API?
Чаще по URL или заголовку; главное — правила совместимости и срок поддержки старых версий.
Что считать ломающим изменением?
Удаление или переименование полей, изменение типов и семантики, ужесточение валидации.