Sdílet prostřednictvím


Generování dokumentů OpenAPI

Balíček Microsoft.AspNetCore.OpenApi poskytuje integrovanou podporu generování dokumentů OpenAPI v ASP.NET Core. Balíček obsahuje následující funkce:

  • Podpora generování dokumentů OpenAPI za běhu a přístup k nim prostřednictvím koncového bodu v aplikaci
  • Podpora rozhraní API transformátoru, která umožňují upravovat vygenerovaný dokument.
  • Podpora generování více dokumentů OpenAPI z jedné aplikace
  • Využívá podporu schématu JSON, kterou System.Text.Jsonposkytuje .
  • Je kompatibilní s nativní AoT.

Instalace balíčku

Microsoft.AspNetCore.OpenApi Nainstalujte balíček:

V konzole Správce balíčků spusťte následující příkaz:

Install-Package Microsoft.AspNetCore.OpenApi -IncludePrerelease

Konfigurace generování dokumentů OpenAPI

Následující kód:

  • Přidá služby OpenAPI.
  • Povolí koncový bod pro zobrazení dokumentu OpenAPI ve formátu JSON.
var builder = WebApplication.CreateBuilder();

builder.Services.AddOpenApi();

var app = builder.Build();

app.MapOpenApi();

app.MapGet("/", () => "Hello world!");

app.Run();

Spusťte aplikaci a přejděte k https://localhost:<port>/openapi/v1.json zobrazení vygenerovaného dokumentu OpenAPI.

Možnosti přizpůsobení generování dokumentů OpenAPI

Následující části ukazují, jak přizpůsobit generování dokumentů OpenAPI.

Přizpůsobení názvu dokumentu OpenAPI

Každý dokument OpenAPI v aplikaci má jedinečný název. Výchozí název dokumentu, který je registrován, je v1.

builder.Services.AddOpenApi(); // Document name is v1

Název dokumentu lze upravit předáním názvu jako parametru AddOpenApi volání.

builder.Services.AddOpenApi("internal"); // Document name is internal

Název dokumentu se zobrazí na několika místech v implementaci OpenAPI.

Při načítání vygenerovaného dokumentu OpenAPI je název dokumentu zadaný jako documentName argument parametru v požadavku. Následující žádosti tyto dokumenty a dokumenty vyřeší v1 internal .

GET http://localhost:5000/openapi/v1.json
GET http://localhost:5000/openapi/internal.json

Přizpůsobení verze OpenAPI vygenerovaného dokumentu

Ve výchozím nastavení vytvoří generování dokumentů OpenAPI dokument, který vyhovuje specifikaci OpenAPI verze 3.0. Následující kód ukazuje, jak upravit výchozí verzi dokumentu OpenAPI:

builder.Services.AddOpenApi(options =>
{
    options.OpenApiVersion = OpenApiSpecVersion.OpenApi2_0;
});

Přizpůsobení trasy koncového bodu OpenAPI

Ve výchozím nastavení koncový bod OpenAPI zaregistrovaný prostřednictvím volání pro MapOpenApi zveřejnění dokumentu na koncovém /openapi/{documentName}.json bodu. Následující kód ukazuje, jak přizpůsobit trasu, ve které je dokument OpenAPI zaregistrovaný:

app.MapOpenApi("/openapi/{documentName}/openapi.json");

Je možné, ale nedoporučuje se odebrat documentName parametr trasy z trasy koncového bodu. documentName Když se parametr trasy odebere ze trasy koncového bodu, architektura se pokusí přeložit název dokumentu z parametru dotazu. Nezadávaní documentName trasy nebo dotazu může vést k neočekávanému chování.

Přizpůsobení koncového bodu OpenAPI

Vzhledem k tomu, že dokument OpenAPI se obsluhuje prostřednictvím koncového bodu obslužné rutiny trasy, je pro koncový bod OpenAPI k dispozici veškeré přizpůsobení, které je dostupné standardním minimálním koncovým bodům.

Omezení přístupu k dokumentům OpenAPI autorizovaným uživatelům

Koncový bod OpenAPI ve výchozím nastavení nepovoluje žádné kontroly autorizace. U dokumentu OpenAPI se ale dají použít kontroly autorizace. V následujícím kódu je přístup k dokumentu OpenAPI omezen na ty, které mají tester roli:

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.OpenApi;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder();

builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization(o =>
{
    o.AddPolicy("ApiTesterPolicy", b => b.RequireRole("tester"));
});
builder.Services.AddOpenApi();

var app = builder.Build();

app.MapOpenApi()
    .RequireAuthorization("ApiTesterPolicy");

app.MapGet("/", () => "Hello world!");

app.Run();

Dokument OpenAPI vygenerovaný v mezipaměti

Dokument OpenAPI se znovu vygeneruje při každém odeslání požadavku na koncový bod OpenAPI. Regenerace umožňuje transformátorům začlenit do provozu dynamický stav aplikace. Například opětovné vygenerování požadavku s podrobnostmi o kontextu HTTP. Pokud je to možné, dokument OpenAPI je možné uložit do mezipaměti, aby se zabránilo spuštění kanálu generování dokumentů na každém požadavku HTTP.

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.OpenApi;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder();

builder.Services.AddOutputCache(options =>
{
    options.AddBasePolicy(policy => policy.Expire(TimeSpan.FromMinutes(10)));
});
builder.Services.AddOpenApi();

var app = builder.Build();

app.UseOutputCache();

app.MapOpenApi()
    .CacheOutput();

app.MapGet("/", () => "Hello world!");

app.Run();

Generování dokumentů OpenAPI v době sestavení

V typických webových aplikacích se dokumenty OpenAPI generují za běhu a obsluhují se prostřednictvím požadavku HTTP aplikačního serveru.

V některých scénářích je užitečné vygenerovat dokument OpenAPI během kroku sestavení aplikace. Mezi tyto scénáře patří:

  • Generování dokumentace OpenAPI, která je potvrzena do správy zdrojového kódu.
  • Generování dokumentace OpenAPI, která se používá pro testování integrace založené na specifikacích.
  • Generování dokumentace OpenAPI obsluhované staticky z webového serveru

Pokud chcete přidat podporu pro generování dokumentů OpenAPI v době sestavení, nainstalujte Microsoft.Extensions.ApiDescription.Server balíček:

V konzole Správce balíčků spusťte následující příkaz:

Install-Package Microsoft.Extensions.ApiDescription.Server -IncludePrerelease

Při instalaci tento balíček automaticky vygeneruje dokumenty rozhraní Open API přidružené k aplikaci během sestavování a naplní je do výstupního adresáře aplikace.

$ dotnet build
$ cat bin/Debug/net9.0/{ProjectName}.json

Přizpůsobení generování dokumentů v době sestavení

Úprava výstupního adresáře vygenerovaného souboru Open API

Ve výchozím nastavení se vygenerovaný dokument OpenAPI vygeneruje do výstupního adresáře aplikace. Chcete-li upravit umístění generovaného souboru, nastavte cílovou cestu ve OpenApiDocumentsDirectory vlastnosti.

<PropertyGroup>
  <OpenApiDocumentsDirectory>./</OpenApiDocumentsDirectory>
</PropertyGroup>

Hodnota OpenApiDocumentsDirectory je vyřešena vzhledem k souboru projektu. ./ Použití výše uvedené hodnoty vygeneruje dokument OpenAPI ve stejném adresáři jako soubor projektu.

Úprava názvu výstupního souboru

Ve výchozím nastavení bude vygenerovaný dokument OpenAPI mít stejný název jako soubor projektu aplikace. Chcete-li změnit název vygenerovaného souboru, nastavte --file-name argument ve OpenApiGenerateDocumentsOptions vlastnosti.

<PropertyGroup>
  <OpenApiGenerateDocumentsOptions>--file-name my-open-api</OpenApiGenerateDocumentsOptions>
</PropertyGroup>

Výběr dokumentu OpenAPI pro vygenerování

Některé aplikace můžou být nakonfigurované tak, aby vygenerovaly více dokumentů OpenAPI, pro různé verze rozhraní API nebo aby rozlišovaly mezi veřejnými a interními rozhraními API. Ve výchozím nastavení generátor dokumentů vygeneruje soubory pro všechny dokumenty nakonfigurované v aplikaci. Chcete-li vygenerovat pouze pro jeden název dokumentu, nastavte --document-name argument ve OpenApiGenerateDocumentsOptions vlastnosti.

<PropertyGroup>
  <OpenApiGenerateDocumentsOptions>--document-name v2</OpenApiGenerateDocumentsOptions>
</PropertyGroup>

Přizpůsobení chování za běhu během generování dokumentu v době sestavení

Pod kapotou funkce generování dokumentů OpenAPI v době sestavení tím, že spustí vstupní bod aplikace s implementací inert serveru. Toto je požadavek na vytvoření přesných dokumentů OpenAPI, protože všechny informace v dokumentu OpenAPI nelze staticky analyzovat. Vzhledem k tomu, že je vyvolána vstupní bod aplikace, bude vyvolána jakákoli logika při spuštění aplikace. To zahrnuje kód, který vloží služby do kontejneru DI nebo čte z konfigurace. V některých scénářích je nutné omezit cesty kódu, které se spustí při vyvolání vstupního bodu aplikace z generování dokumentu v době sestavení. Mezi tyto scénáře patří:

  • Nečte se z určitých konfiguračních řetězců.
  • Nezaregistrovává se databázové služby.

Aby bylo možné tyto cesty ke kódu volat kanálem generování v čase sestavení, mohou být podmíněny za kontrolou vstupního sestavení, například takto:

using System.Reflection;

var builder = WebApplication.CreateBuilder();

if (Assembly.GetEntryAssembly()?.GetName().Name != "GetDocument.Insider")
{
  builder.Services.AddDefaults();
}

Minimální rozhraní API poskytují integrovanou podporu generování informací o koncových bodech v aplikaci prostřednictvím Microsoft.AspNetCore.OpenApi balíčku. Zveřejnění vygenerované definice OpenAPI prostřednictvím vizuálního uživatelského rozhraní vyžaduje balíček třetí strany. Informace o podpoře rozhraní OPENAPI v rozhraních API založených na kontroleru najdete ve verzi tohoto článku v .NET 9.

Následující kód vygeneruje ASP.NET minimální šablona webového rozhraní API a používá OpenAPI:

using Microsoft.AspNetCore.OpenApi;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

var summaries = new[]
{
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

app.MapGet("/weatherforecast", () =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateTime.Now.AddDays(index),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();

app.Run();

internal record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
{
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

V předchozím zvýrazněném kódu:

  • Microsoft.AspNetCore.OpenApi je vysvětleno v další části.
  • AddEndpointsApiExplorer : Nakonfiguruje aplikaci tak, aby používala Průzkumníka rozhraní API ke zjišťování a popisu koncových bodů s výchozími poznámkami. WithOpenApi přepisuje porovnávání výchozích poznámek vygenerovaných Průzkumníkem rozhraní API s poznámkami vytvořenými z Microsoft.AspNetCore.OpenApi balíčku.
  • UseSwaggerpřidá middleware Swaggeru.
  • UseSwaggerUI umožňuje vloženou verzi nástroje Swagger UI.
  • WithName: Koncový IEndpointNameMetadata bod se používá pro generování propojení a považuje se za ID operace ve specifikaci OpenAPI daného koncového bodu.
  • WithOpenApi je vysvětleno dále v tomto článku.

Microsoft.AspNetCore.OpenApi Balíček NuGet

ASP.NET Core poskytuje Microsoft.AspNetCore.OpenApi balíček pro interakci se specifikacemi OpenAPI pro koncové body. Balíček funguje jako propojení mezi modely OpenAPI definovanými v Microsoft.AspNetCore.OpenApi balíčku a koncovými body definovanými v minimálních rozhraních API. Balíček poskytuje rozhraní API, které zkoumá parametry koncového bodu, odpovědi a metadata a vytváří typ anotace OpenAPI, který se používá k popisu koncového bodu.

Microsoft.AspNetCore.OpenApi se přidá jako PackageReference do souboru projektu:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>    
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.*-*" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
  </ItemGroup>

</Project>

Při použití Swashbuckle.AspNetCore s Microsoft.AspNetCore.OpenApi, Swashbuckle.AspNetCore 6.4.0 nebo novější musí být použita. Microsoft.OpenApi 1.4.3 nebo novější se musí použít k využití konstruktorů kopírování při WithOpenApi vyvolání.

Přidání poznámek OpenAPI ke koncovým bodům prostřednictvím WithOpenApi

Volání WithOpenApi koncového bodu se přidá do metadat koncového bodu. Tato metadata můžou být následující:

  • Spotřebované v balíčcích třetích stran, jako je Swashbuckle.AspNetCore.
  • Zobrazí se v uživatelském rozhraní Swaggeru nebo ve vygenerovaném YAML nebo JSON pro definování rozhraní API.
app.MapPost("/todoitems/{id}", async (int id, Todo todo, TodoDb db) =>
{
    todo.Id = id;
    db.Todos.Add(todo);
    await db.SaveChangesAsync();

    return Results.Created($"/todoitems/{todo.Id}", todo);
})
.WithOpenApi();

Úprava poznámky OpenAPI v WithOpenApi

Metoda WithOpenApi přijímá funkci, kterou lze použít k úpravě anotace OpenAPI. Například v následujícím kódu se k prvnímu parametru koncového bodu přidá popis:

app.MapPost("/todo2/{id}", async (int id, Todo todo, TodoDb db) =>
{
    todo.Id = id;
    db.Todos.Add(todo);
    await db.SaveChangesAsync();

    return Results.Created($"/todoitems/{todo.Id}", todo);
})
.WithOpenApi(generatedOperation =>
{
    var parameter = generatedOperation.Parameters[0];
    parameter.Description = "The ID associated with the created Todo";
    return generatedOperation;
});

Přidání ID operací do OpenAPI

ID operací se používají k jednoznačné identifikaci daného koncového bodu v OpenAPI. Metodu WithName rozšíření lze použít k nastavení ID operace použité pro metodu.

app.MapGet("/todoitems2", async (TodoDb db) =>
    await db.Todos.ToListAsync())
    .WithName("GetToDoItems");

Alternativně OperationId lze vlastnost nastavit přímo na anotaci OpenAPI.

app.MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
    .WithOpenApi(operation => new(operation)
    {
        OperationId = "GetTodos"
    });

Přidání značek do popisu OpenAPI

OpenAPI podporuje kategorizaci operací pomocí objektů značek. Tyto značky se obvykle používají k seskupení operací v uživatelském rozhraní Swaggeru. Tyto značky lze do operace přidat vyvoláním metody rozšíření WithTags na koncovém bodu s požadovanými značkami.

app.MapGet("/todoitems", async (TodoDb db) =>
    await db.Todos.ToListAsync())
    .WithTags("TodoGroup");

Případně můžete seznam OpenApiTags nastavit na anotaci OpenAPI prostřednictvím WithOpenApi metody rozšíření.

app.MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
    .WithOpenApi(operation => new(operation)
    {
        Tags = new List<OpenApiTag> { new() { Name = "Todos" } }
    });

Přidání souhrnu nebo popisu koncového bodu

Souhrn a popis koncového WithOpenApi bodu můžete přidat vyvoláním metody rozšíření. V následujícím kódu jsou souhrny nastavené přímo na anotaci OpenAPI.

app.MapGet("/todoitems2", async (TodoDb db) => await db.Todos.ToListAsync())
    .WithOpenApi(operation => new(operation)
    {
        Summary = "This is a summary",
        Description = "This is a description"
    });

Vyloučit popis OpenAPI

V následující ukázce /skipme je koncový bod vyloučený z generování popisu OpenAPI:

using Microsoft.AspNetCore.OpenApi;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();

app.MapGet("/swag", () => "Hello Swagger!")
    .WithOpenApi();
app.MapGet("/skipme", () => "Skipping Swagger.")
                    .ExcludeFromDescription();

app.Run();

Označení rozhraní API jako zastaralé

Pokud chcete koncový bod označit jako zastaralý, nastavte Deprecated vlastnost v poznámce OpenAPI.

app.MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
    .WithOpenApi(operation => new(operation)
    {
        Deprecated = true
    });

Popis typů odpovědí

OpenAPI podporuje zadání popisu odpovědí vrácených z rozhraní API. Minimální rozhraní API podporují tři strategie nastavení typu odpovědi koncového bodu:

Metodu Produces rozšíření lze použít k přidání Produces metadat do koncového bodu. Pokud nejsou zadány žádné parametry, metoda rozšíření naplní metadata pro cílový typ pod stavovým kódem 200 a typem application/json obsahu.

app
    .MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
    .Produces<IList<Todo>>();

Použití TypedResults v implementaci obslužné rutiny trasy koncového bodu automaticky zahrnuje metadata typu odpovědi pro koncový bod. Například následující kód automaticky anotuje koncový bod odpovědí pod 200 stavovým kódem s typem application/json obsahu.

app.MapGet("/todos", async (TodoDb db) =>
{
    var todos = await db.Todos.ToListAsync());
    return TypedResults.Ok(todos);
});

Nastavení odpovědí pro ProblemDetails

Při nastavování typu odpovědi pro koncové body, které můžou vrátit odpověď ProblemDetails, metodu ProducesProblem ProducesValidationProblemrozšíření nebo TypedResults.Problem lze použít k přidání příslušné poznámky k metadatům koncového bodu. Všimněte si, že ProducesProblem metody a ProducesValidationProblem metody rozšíření nelze použít se skupinami tras v .NET 8 a starších verzích.

Pokud neexistují žádné explicitní poznámky poskytované některou z výše uvedených strategií, architektura se pokusí určit výchozí typ odpovědi prozkoumáním podpisu odpovědi. Tato výchozí odpověď se vyplní pod stavový 200 kód v definici OpenAPI.

Více typů odpovědí

Pokud koncový bod může v různých scénářích vracet různé typy odpovědí, můžete zadat metadata následujícími způsoby:

  • Volejte metodu Produces rozšíření několikrát, jak je znázorněno v následujícím příkladu:

    app.MapGet("/api/todoitems/{id}", async (int id, TodoDb db) =>
             await db.Todos.FindAsync(id) 
             is Todo todo
             ? Results.Ok(todo) 
             : Results.NotFound())
       .Produces<Todo>(StatusCodes.Status200OK)
       .Produces(StatusCodes.Status404NotFound);
    
  • Použijte Results<TResult1,TResult2,TResultN> v podpisu a TypedResults v textu obslužné rutiny, jak je znázorněno v následujícím příkladu:

    app.MapGet("/book/{id}", Results<Ok<Book>, NotFound> (int id, List<Book> bookList) =>
    {
        return bookList.FirstOrDefault((i) => i.Id == id) is Book book
         ? TypedResults.Ok(book)
         : TypedResults.NotFound();
    });
    

    Typy Results<TResult1,TResult2,TResultN> sjednocení deklarují, že obslužná rutina trasy vrací několik IResultkonkrétních typů a jakýkoli z těchto typů, které implementují IEndpointMetadataProvider , přispívají k metadatům koncového bodu.

    Typy sjednocení implementují implicitní operátory přetypování. Tyto operátory umožňují kompilátoru automaticky převést typy zadané v obecných argumentech na instanci sjednocovacího typu. Tato funkce má přidanou výhodu poskytování kontroly času kompilace, že obslužná rutina trasy vrací pouze výsledky, které deklaruje. Pokus o vrácení typu, který není deklarován jako jeden z obecných argumentů, aby výsledkem Results<TResult1,TResult2,TResultN> byla chyba kompilace.

Popis textu a parametrů požadavku

Kromě popisu typů vrácených koncovým bodem podporuje OpenAPI také přidávání poznámek ke vstupům spotřebovaným rozhraním API. Tyto vstupy spadají do dvou kategorií:

  • Parametry, které se zobrazují v cestě, řetězci dotazu, hlavičkách nebo souborech cookie
  • Data přenášená jako součást textu požadavku

Architektura odvodí typy parametrů požadavku v cestě, dotazu a řetězci hlavičky automaticky na základě podpisu obslužné rutiny trasy.

Chcete-li definovat typ vstupů přenášených jako tělo požadavku, nakonfigurujte vlastnosti pomocí Accepts rozšiřující metody k definování typu objektu a typu obsahu, které jsou očekávány obslužnou rutinou požadavku. V následujícím příkladu koncový bod přijímá Todo objekt v textu požadavku s očekávaným typem application/xmlobsahu .

app.MapPost("/todos/{id}", (int id, Todo todo) => ...)
  .Accepts<Todo>("application/xml");

Kromě rozšiřující metody může typ parametru Accepts popsat vlastní poznámku IEndpointParameterMetadataProvider implementací rozhraní. Následující typ například Todo přidá poznámku, která vyžaduje text požadavku s typem application/xml obsahu.

public class Todo : IEndpointParameterMetadataProvider
{
    public static void PopulateMetadata(ParameterInfo parameter, EndpointBuilder builder)
    {
        builder.Metadata.Add(new ConsumesAttribute(typeof(Todo), isOptional: false, "application/xml"));
    }
}

Pokud není zadána žádná explicitní poznámka, architektura se pokusí určit výchozí typ požadavku, pokud je v obslužné rutině koncového bodu parametr textu požadavku. Odvození používá k vytvoření poznámky následující heuristiku:

  • Parametry textu požadavku, které se čtou z formuláře prostřednictvím atributu [FromForm] , jsou popsány pomocí multipart/form-data typu obsahu.
  • Všechny ostatní parametry textu požadavku jsou popsány pomocí application/json typu obsahu.
  • Tělo požadavku je považováno za volitelné, pokud je nullable nebo pokud AllowEmpty je vlastnost nastavena na FromBody atribut.

Podpora správy verzí rozhraní API

Minimální rozhraní API podporují správu verzí rozhraní API prostřednictvím balíčku Asp.Versioning.Http. Příklady konfigurace správy verzí s minimálními rozhraními API najdete v úložišti správy verzí rozhraní API.

ASP.NET základní zdrojový kód OpenAPI na GitHubu

Další materiály

Minimální aplikace API může popsat specifikaci OpenAPI pro obslužné rutiny tras pomocí Swashbuckle.

Informace o podpoře rozhraní OPENAPI v rozhraních API založených na kontroleru najdete ve verzi tohoto článku v .NET 9.

Následující kód je typická aplikace ASP.NET Core s podporou OpenAPI:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new() { Title = builder.Environment.ApplicationName,
                               Version = "v1" });
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger(); // UseSwaggerUI Protected by if (env.IsDevelopment())
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json",
                                    $"{builder.Environment.ApplicationName} v1"));
}

app.MapGet("/swag", () => "Hello Swagger!");

app.Run();

Vyloučit popis OpenAPI

V následující ukázce /skipme je koncový bod vyloučený z generování popisu OpenAPI:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(); // UseSwaggerUI Protected by if (env.IsDevelopment())
}

app.MapGet("/swag", () => "Hello Swagger!");
app.MapGet("/skipme", () => "Skipping Swagger.")
                    .ExcludeFromDescription();

app.Run();

Popis typů odpovědí

Následující příklad používá předdefinované typy výsledků k přizpůsobení odpovědi:

app.MapGet("/api/todoitems/{id}", async (int id, TodoDb db) =>
         await db.Todos.FindAsync(id) 
         is Todo todo
         ? Results.Ok(todo) 
         : Results.NotFound())
   .Produces<Todo>(StatusCodes.Status200OK)
   .Produces(StatusCodes.Status404NotFound);

Přidání ID operací do OpenAPI

app.MapGet("/todoitems2", async (TodoDb db) =>
    await db.Todos.ToListAsync())
    .WithName("GetToDoItems");

Přidání značek do popisu OpenAPI

Následující kód používá značku seskupení OpenAPI:

app.MapGet("/todoitems", async (TodoDb db) =>
    await db.Todos.ToListAsync())
    .WithTags("TodoGroup");