Dela via


Generera OpenAPI-dokument

Microsoft.AspNetCore.OpenApi-paketet ger inbyggt stöd för OpenAPI-dokumentgenerering i ASP.NET Core. Paketet innehåller följande funktioner:

  • Stöd för att generera OpenAPI-dokument under körningen och ge åtkomst till dem via en slutpunkt i applikationen.
  • Stöd för "transformerings-API:er" som gör det möjligt att ändra det genererade dokumentet.
  • Stöd för att generera flera OpenAPI-dokument från en enda app.
  • Utnyttjar JSON-schemastöd som tillhandahålls av System.Text.Json.
  • Är kompatibel med inbyggd AoT.

Paketinstallation

Installera Microsoft.AspNetCore.OpenApi-paketet:

Kör följande kommando från Package Manager-konsolen:

Install-Package Microsoft.AspNetCore.OpenApi

Konfigurera OpenAPI-dokumentgenerering

Följande kod:

  • Lägger till OpenAPI-tjänster.
  • Aktiverar slutpunkten för att visa OpenAPI-dokumentet i JSON-format.
var builder = WebApplication.CreateBuilder();

builder.Services.AddOpenApi();

var app = builder.Build();

app.MapOpenApi();

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

app.Run();

Starta appen och gå till https://localhost:<port>/openapi/v1.json för att visa det genererade OpenAPI-dokumentet.

Alternativ för att anpassa OpenAPI-dokumentgenerering

Följande avsnitt visar hur du anpassar OpenAPI-dokumentgenerering.

Anpassa OpenAPI-dokumentnamnet

Varje OpenAPI-dokument i en app har ett unikt namn. Standarddokumentnamnet som är registrerat är v1.

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

Dokumentnamnet kan ändras genom att skicka namnet som en parameter till AddOpenApi-anropet.

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

Dokumentnamnet visas på flera platser i OpenAPI-implementeringen.

När du hämtar det genererade OpenAPI-dokumentet anges dokumentnamnet som argumentet documentName parameter i begäran. Följande begäranden behandlar dokumenten v1 och internal.

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

Anpassa OpenAPI-versionen av ett genererat dokument

Som standard skapar OpenAPI-dokumentgenerering ett dokument som är kompatibelt med v3.0 i OpenAPI-specifikationen. Följande kod visar hur du ändrar standardversionen av OpenAPI-dokumentet:

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

Anpassa OpenAPI-slutpunktsvägen

Som standard exponerar OpenAPI-slutpunkten som registrerats via ett anrop till MapOpenApi dokumentet på /openapi/{documentName}.json slutpunkten. Följande kod visar hur du anpassar den väg där OpenAPI-dokumentet är registrerat:

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

Det är möjligt, men rekommenderas inte, att ta bort documentName vägparametern från slutpunktsvägen. När documentName vägparametern tas bort från slutpunktsrutten försöker ramverket lösa ut dokumentnamnet från en frågeparameter. Om du inte anger documentName i antingen vägen eller frågan kan det leda till oväntat beteende.

Anpassa OpenAPI-slutpunkten

Eftersom OpenAPI-dokumentet hanteras via en slutpunkt för routningshanterare är alla anpassningar som är tillgängliga för minimala standardslutpunkter tillgängliga för OpenAPI-slutpunkten.

Begränsa OpenAPI-dokumentåtkomst till behöriga användare

OpenAPI-slutpunkten aktiverar inte några auktoriseringskontroller som standard. Auktoriseringskontroller kan dock tillämpas på OpenAPI-dokumentet. I följande kod är åtkomsten till OpenAPI-dokumentet begränsad till dem med den tester rollen:

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();

Cachegenererat OpenAPI-dokument

OpenAPI-dokumentet återskapas varje gång en begäran till OpenAPI-slutpunkten skickas. Regenerering gör det möjligt för transformatorer att införliva dynamiskt programtillstånd i sin drift. Till exempel återskapa en begäran med information om HTTP-kontexten. När det är tillämpligt kan OpenAPI-dokumentet cachelagras för att undvika att köra pipelinen för dokumentgenerering på varje HTTP-begäran.

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();

Generera OpenAPI-dokument vid byggtid

I vanliga webbprogram genereras OpenAPI-dokument vid körning och hanteras via en HTTP-begäran till programservern.

I vissa scenarier är det bra att generera OpenAPI-dokumentet under programmets byggsteg. Dessa scenarier omfattar:

  • Generera OpenAPI-dokumentation som har checkats in i källkontrollen.
  • Generera OpenAPI-dokumentation som används för specifikationsbaserad integreringstestning.
  • Generera OpenAPI-dokumentation som hanteras statiskt från webbservern.

Om du vill lägga till stöd för att generera OpenAPI-dokument vid bygget installerar du Microsoft.Extensions.ApiDescription.Server-paketet:

Kör följande kommando från Package Manager-konsolen:

Install-Package Microsoft.Extensions.ApiDescription.Server

Vid installationen genererar det här paketet automatiskt de Öppna API-dokument som är associerade med programmet under bygget och fyller i dem i programmets utdatakatalog.

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

Anpassa generering av byggtidsdokument

Ändra utdatakatalogen för den genererade Öppna API-filen

Som standard skickas det genererade OpenAPI-dokumentet till programmets utdatakatalog. För att ändra platsen för den genererade filen anger du målsökvägen i egenskapen OpenApiDocumentsDirectory.

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

Värdet för OpenApiDocumentsDirectory bestäms i förhållande till projektfilen. Genom att använda värdet ./ ovan kommer OpenAPI-dokumentet att placeras i samma katalog som projektfilen.

Ändra namnet på utdatafilen

Som standard har det genererade OpenAPI-dokumentet samma namn som programmets projektfil. Om du vill ändra namnet på den utelämnade filen anger du argumentet --file-name i egenskapen OpenApiGenerateDocumentsOptions.

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

Välja det OpenAPI-dokument som ska genereras

Vissa program kan konfigureras för att generera flera OpenAPI-dokument, för olika versioner av ett API eller för att skilja mellan offentliga och interna API:er. Som standard genererar byggtidsdokumentgeneratorn filer för alla dokument som har konfigurerats i ett program. Om du bara vill generera ett enda dokumentnamn anger du argumentet --document-name i egenskapen OpenApiGenerateDocumentsOptions.

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

Anpassa körningsbeteende under generering av byggtidsdokument

OpenAPI-funktioner för dokumentgenerering vid byggtid genom att starta applikationens startpunkt med en mockserver-implementation. En falsk server krävs för att skapa korrekta OpenAPI-dokument eftersom all information i OpenAPI-dokumentet inte kan analyseras statiskt. Eftersom appinmatningspunkten anropas anropas all logik i appstarten. Detta inkluderar kod som matar in tjänster i DI-containern eller läser från konfigurationen. I vissa scenarier är det nödvändigt att begränsa de kodsökvägar som ska köras när apparnas startpunkt anropas från dokumentgenerering vid byggtid. Dessa scenarier omfattar:

  • Läser inte från vissa konfigurationssträngar.
  • Registrerar inte databasrelaterade tjänster.

För att begränsa dessa kodvägar från att anropas av byggtidsgenereringspipelinens kan de villkoras bakom en kontroll av inmatningssamlingen.

using System.Reflection;

var builder = WebApplication.CreateBuilder(args);

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

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error", createScopeForErrors: true);
    app.UseHsts();
}

var myKeyValue = app.Configuration["MyKey"];

app.MapGet("/", () => {
    return Results.Ok($"The value of MyKey is: {myKeyValue}");
})
.WithName("TestKey");

app.Run();

AddServiceDefaults Lägger till vanliga .NET Aspire tjänster som tjänstidentifiering, motståndskraft, hälsokontroller och OpenTelemetry.

Trimning och intern AOT

OpenAPI i ASP.NET Core stöder trimning och intern AOT. Följande steg skapar och publicerar en OpenAPI-app med trimning och inbyggd AOT:

Skapa ett nytt ASP.NET Core Web API-projekt (native AOT).

dotnet new webapiaot

Lägg till Paketet Microsoft.AspNetCore.OpenAPI.

dotnet add package Microsoft.AspNetCore.OpenApi --prerelease

Uppdatera Program.cs för att aktivera generering av OpenAPI-dokument.

+ builder.Services.AddOpenApi();

var app = builder.Build();

+ app.MapOpenApi();

Publicera appen.

dotnet publish

Minimala API:er ger inbyggt stöd för att generera information om slutpunkter i en app via Microsoft.AspNetCore.OpenApi-paketet. För att exponera den genererade OpenAPI-definitionen via ett visuellt användargränssnitt krävs ett paket från tredje part. Information om stöd för OpenAPI i kontrollantbaserade API:er finns i .NET 9-versionen av den här artikeln.

Följande kod genereras av ASP.NET Core minimal webb-API-mall och använder 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);
}

I föregående markerade kod:

  • Microsoft.AspNetCore.OpenApi beskrivs i nästa avsnitt.
  • AddEndpointsApiExplorer : Konfigurerar appen för att använda API Explorer för att identifiera och beskriva slutpunkter med standardanteckningar. WithOpenApi åsidosätter matchning, standardanteckningar som genereras av API Explorer med de som skapas från Microsoft.AspNetCore.OpenApi-paketet.
  • UseSwaggerlägger till Swagger-mellanprogram.
  • "UseSwaggerUI" möjliggör en inbäddad version av Swagger UI-verktyget.
  • WithName: IEndpointNameMetadata på slutpunkten används för länkgenerering och behandlas som åtgärds-ID i den angivna slutpunktens OpenAPI-specifikation.
  • WithOpenApi beskrivs senare i den här artikeln.

Microsoft.AspNetCore.OpenApi NuGet-paket

ASP.NET Core tillhandahåller Microsoft.AspNetCore.OpenApi-paketet för att interagera med OpenAPI-specifikationer för slutpunkter. Paketet fungerar som en länk mellan OpenAPI-modellerna som definieras i Microsoft.AspNetCore.OpenApi-paketet och de slutpunkter som definieras i Minimala API:er. Paketet tillhandahåller ett API som undersöker en slutpunkts parametrar, svar och metadata för att konstruera en OpenAPI-anteckningstyp som används för att beskriva en slutpunkt.

Microsoft.AspNetCore.OpenApi läggs till som en PackageReference i en projektfil:

<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>

När du använder Swashbuckle.AspNetCore med Microsoft.AspNetCore.OpenApimåste Swashbuckle.AspNetCore 6.4.0 eller senare användas. Microsoft.OpenApi 1.4.3 eller senare måste användas för att utnyttja kopieringskonstruktorer i WithOpenApi-anrop.

Lägga till OpenAPI-anteckningar i slutpunkter via WithOpenApi

Genom att anropa WithOpenApi på slutpunkten läggs information till i slutpunktens metadata. Dessa metadata kan vara:

  • Förbrukas i tredjepartspaket som Swashbuckle.AspNetCore.
  • Visas i Swagger-användargränssnittet eller i YAML eller JSON som genererats för att definiera API:et.
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();

Ändra OpenAPI-kommentaren i WithOpenApi

Metoden WithOpenApi accepterar en funktion som kan användas för att ändra OpenAPI-kommentaren. I följande kod läggs till exempel en beskrivning till i slutpunktens första parameter:

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;
});

Lägga till åtgärds-ID:t i OpenAPI

Åtgärds-ID:er används för att unikt identifiera en viss slutpunkt i OpenAPI. Metoden WithName tillägg kan användas för att ange det åtgärds-ID som används för en metod.

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

Du kan också ange egenskapen OperationId direkt i OpenAPI-kommentaren.

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

Lägga till taggar i OpenAPI-beskrivningen

OpenAPI stöder användning av taggobjekt för att kategorisera åtgärder. Dessa taggar används vanligtvis för att gruppera åtgärder i Swagger-användargränssnittet. Dessa taggar kan läggas till i en åtgärd genom att anropa metoden WithTags-tillägg på slutpunkten med önskade taggar.

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

Du kan också ange listan över OpenApiTags i OpenAPI-kommentaren via WithOpenApi-tilläggsmetoden.

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

Lägg till sammanfattning eller beskrivning av slutpunkt

Slutpunktssammanfattningen och beskrivningen kan läggas till genom att anropa WithOpenApi-tilläggsmetoden. I följande kod anges sammanfattningarna direkt i OpenAPI-kommentaren.

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

Exkludera OpenAPI-beskrivning

I följande exempel utesluts slutpunkten /skipme från att generera en OpenAPI-beskrivning.

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();

Markera ett API som föråldrat

Om du vill markera en slutpunkt som föråldrad anger du egenskapen Deprecated på OpenAPI-kommentaren.

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

Beskriva svarstyper

OpenAPI har stöd för att tillhandahålla en beskrivning av svaren som returneras från ett API. Minimala API:er stöder tre strategier för att ange svarstypen för en slutpunkt:

Tilläggsmetoden Produces kan användas för att lägga till Produces-metadata till en slutpunkt. När inga parametrar anges fyller tilläggsmetoden metadata för måltypen under en 200 statuskod och en application/json innehållstyp.

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

Användning av TypedResults i implementeringen av en slutpunkts routningshanterare innehåller automatiskt metadata för svarstyp för slutpunkten. Följande kod kommenterar till exempel automatiskt slutpunkten med ett svar under statuskoden 200 med en application/json innehållstyp.

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

Ange svar för ProblemDetails

När du anger svarstypen för slutpunkter som kan returnera ett ProblemDetails-svar kan ProducesProblem-tilläggsmetoden ProducesValidationProblemeller TypedResults.Problem användas för att lägga till lämplig anteckning i slutpunktens metadata. Observera att ProducesProblem- och ProducesValidationProblem-tilläggsmetoderna inte kan användas med routningsgrupper i .NET 8 och tidigare.

När det inte finns några explicita anteckningar från någon av strategierna ovan försöker ramverket fastställa en standardsvarstyp genom att undersöka svarets signatur. Det här standardsvaret fylls i under statuskoden 200 i OpenAPI-definitionen.

Flera svarstyper

Om en slutpunkt kan returnera olika svarstyper i olika scenarier kan du ange metadata på följande sätt:

  • Anropa Produces-tilläggsmetoden flera gånger, som du ser i följande exempel:

    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);
    
  • Använd Results<TResult1,TResult2,TResultN> i signaturen och TypedResults i hanterarens brödtext, som du ser i följande exempel:

    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();
    });
    

    De Results<TResult1,TResult2,TResultN>unionstyper deklarerar att en routningshanterare returnerar flera konkreta typer som implementerar IResult, och var och en av de typer som implementerar IEndpointMetadataProvider kommer att bidra till slutpunktens metadata.

    Union-typerna implementerar implicita cast-operatorer. Dessa operatorer gör det möjligt för kompilatorn att automatiskt konvertera de typer som anges i de allmänna argumenten till en instans av unionstypen. Den här funktionen har den extra fördelen att tillhandahålla kompileringstidskontroll att en routningshanterare endast returnerar de resultat som den deklarerar att den gör. Försök att returnera en typ som inte deklareras som ett av de allmänna argumenten för att Results<TResult1,TResult2,TResultN> resulterar i ett kompileringsfel.

Beskriva begärandetext och parametrar

Förutom att beskriva de typer som returneras av en slutpunkt har OpenAPI även stöd för att kommentera indata som används av ett API. Dessa indata delas in i två kategorier:

  • Parametrar som visas i sökvägen, frågesträngen, rubrikerna eller cookies
  • Data som överförs som en del av begärandetexten

Ramverket härleder typerna för begäransparametrar i sökvägen, frågan och huvudsträngen automatiskt baserat på väghanterarens signatur.

Om du vill definiera vilken typ av indata som skickas som begärandetext konfigurerar du egenskaperna med hjälp av metoden Accepts tillägg för att definiera den objekttyp och innehållstyp som förväntas av begärandehanteraren. I följande exempel accepterar slutpunkten ett Todo objekt i begärandetexten med en förväntad innehållstyp av application/xml.

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

Utöver Accepts-tilläggsmetoden kan en parametertyp beskriva sin egen anteckning genom att implementera IEndpointParameterMetadataProvider-gränssnittet. Följande Todo typ lägger till en anteckning som kräver en begärandetext med en application/xml innehållstyp.

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

När ingen explicit anteckning har angetts försöker ramverket fastställa standardtypen för begäran om det finns en parameter för begärandetext i slutpunktshanteraren. Slutsatsdragningen använder följande heuristik för att skapa kommentaren:

  • Brödtextparametrar för begäran som läss från ett formulär via attributet [FromForm] beskrivs med multipart/form-data innehållstyp.
  • Alla andra parametrar för begärandetext beskrivs med application/json innehållstyp.
  • Begärandetexten behandlas som valfri om den är nullbar eller om egenskapen AllowEmpty har angetts för attributet FromBody.

Stöd för API-versionshantering

Minimala API:er stöder API-versionshantering via Asp.Versioning.Http-paketet. Exempel på hur du konfigurerar versionshantering med minimala API:er finns i lagringsplatsen för API-versionshantering.

ASP.NET Core OpenAPI-källkod på GitHub

Ytterligare resurser

En minimal API-app kan beskriva OpenAPI-specifikationen för routningshanterare med hjälp av Swashbuckle.

Information om stöd för OpenAPI i kontrollantbaserade API:er finns i .NET 9-versionen av den här artikeln.

Följande kod är en typisk ASP.NET Core-app med OpenAPI-stöd:

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();

Exkludera OpenAPI-beskrivning

I följande exempel undantas slutpunkt /skipme från att generera en OpenAPI-beskrivning.

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();

Beskriva svarstyper

I följande exempel används de inbyggda resultattyperna för att anpassa svaret:

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);

Lägga till åtgärds-ID:t i OpenAPI

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

Lägga till taggar i OpenAPI-beskrivningen

Följande kod använder en OpenAPI-grupperingstagg:

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