OpenAPI belgeleri oluşturma
Paket, Microsoft.AspNetCore.OpenApi
ASP.NET Core'da OpenAPI belge oluşturma için yerleşik destek sağlar. Paket aşağıdaki özellikleri sağlar:
- Çalışma zamanında OpenAPI belgeleri oluşturma ve uygulamadaki bir uç nokta üzerinden bunlara erişme desteği.
- Oluşturulan belgenin değiştirilmesine izin veren "transformatör" API'leri desteği.
- Tek bir uygulamadan birden çok OpenAPI belgesi oluşturma desteği.
- tarafından sağlanan JSON şema desteğinden yararlanır
System.Text.Json
. - Yerel AoT ile uyumludur.
Paket yükleme
Microsoft.AspNetCore.OpenApi
Paketi yükleyin:
Paket Yöneticisi Konsolu'ndan aşağıdaki komutu çalıştırın:
Install-Package Microsoft.AspNetCore.OpenApi
OpenAPI belge oluşturmayı yapılandırma
Aşağıdaki kod:
- OpenAPI hizmetleri ekler.
- OpenAPI belgesini JSON biçiminde görüntülemek için uç noktayı etkinleştirir.
var builder = WebApplication.CreateBuilder();
builder.Services.AddOpenApi();
var app = builder.Build();
app.MapOpenApi();
app.MapGet("/", () => "Hello world!");
app.Run();
Uygulamayı başlatın ve oluşturulan OpenAPI belgesini görüntülemek için adresine gidin https://localhost:<port>/openapi/v1.json
.
OpenAPI belge oluşturmayı özelleştirme seçenekleri
Aşağıdaki bölümlerde OpenAPI belge oluşturma işleminin nasıl özelleştirileceği gösterilmektedir.
OpenAPI belge adını özelleştirme
Bir uygulamadaki her OpenAPI belgesinin benzersiz bir adı vardır. Kaydedilen varsayılan belge adıdır v1
.
builder.Services.AddOpenApi(); // Document name is v1
Belge adı, çağrıya AddOpenApi
parametre olarak geçirilerek değiştirilebilir.
builder.Services.AddOpenApi("internal"); // Document name is internal
Belge adı, OpenAPI uygulamasında çeşitli yerlerde görünür.
Oluşturulan OpenAPI belgesi getirilirken, belge adı istekte documentName
parametre bağımsız değişkeni olarak sağlanır. Aşağıdaki istekler ve internal
belgelerini çözümlerv1
.
GET http://localhost:5000/openapi/v1.json
GET http://localhost:5000/openapi/internal.json
Oluşturulan belgenin OpenAPI sürümünü özelleştirme
Varsayılan olarak, OpenAPI belge oluşturma, OpenAPI belirtiminin v3.0 ile uyumlu bir belge oluşturur. Aşağıdaki kod, OpenAPI belgesinin varsayılan sürümünün nasıl değiştirileceği gösterilmektedir:
builder.Services.AddOpenApi(options =>
{
options.OpenApiVersion = OpenApiSpecVersion.OpenApi2_0;
});
OpenAPI uç noktası yolunu özelleştirme
Varsayılan olarak, çağrı MapOpenApi yoluyla kaydedilen OpenAPI uç noktası belgeyi /openapi/{documentName}.json
uç noktada kullanıma sunar. Aşağıdaki kodda, OpenAPI belgesinin kaydedildiği yolun nasıl özelleştirileceği gösterilmektedir:
app.MapOpenApi("/openapi/{documentName}/openapi.json");
Yol parametresini uç nokta yolundan documentName
kaldırmak mümkündür ancak önerilmez. documentName
Yol parametresi uç nokta yolundan kaldırıldığında, çerçeve sorgu parametresinden belge adını çözümlemeye çalışır. yolunun veya sorgunun sağlanmaması documentName
beklenmeyen davranışa neden olabilir.
OpenAPI uç noktasını özelleştirme
OpenAPI belgesi bir yol işleyicisi uç noktası aracılığıyla sunulduğundan, standart en düşük uç noktalarda kullanılabilen tüm özelleştirmeler OpenAPI uç noktası tarafından kullanılabilir.
OpenAPI belge erişimini yetkili kullanıcılarla sınırlama
OpenAPI uç noktası varsayılan olarak hiçbir yetkilendirme denetimini etkinleştirmez. Ancak, yetkilendirme denetimleri OpenAPI belgesine uygulanabilir. Aşağıdaki kodda, OpenAPI belgesine erişim rolüne tester
sahip olanlarla sınırlıdır:
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();
Önbellekle oluşturulan OpenAPI belgesi
OpenAPI belgesi, OpenAPI uç noktasına her istek gönderildiğinde yeniden oluşturulur. Yeniden oluşturma, transformatörlerin dinamik uygulama durumunu çalışmalarına dahil etmelerini sağlar. Örneğin, isteği HTTP bağlamının ayrıntılarıyla yeniden oluşturma. Uygun olduğunda, her HTTP isteğinde belge oluşturma işlem hattının yürütülmesini önlemek için OpenAPI belgesi önbelleğe alınabilir.
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();
Derleme zamanında OpenAPI belgeleri oluşturma
Tipik web uygulamalarında OpenAPI belgeleri çalışma zamanında oluşturulur ve uygulama sunucusuna bir HTTP isteği aracılığıyla sunulur.
Bazı senaryolarda, uygulamanın derleme adımı sırasında OpenAPI belgesini oluşturmak yararlı olur. Bu senaryolar şunlardır:
- Kaynak denetimine kaydedilmiş OpenAPI belgeleri oluşturma.
- Belirtim tabanlı tümleştirme testi için kullanılan OpenAPI belgeleri oluşturma.
- Web sunucusundan statik olarak sunulan OpenAPI belgeleri oluşturma.
Derleme zamanında OpenAPI belgeleri oluşturma desteği eklemek için paketini yükleyin Microsoft.Extensions.ApiDescription.Server
:
Paket Yöneticisi Konsolu'ndan aşağıdaki komutu çalıştırın:
Install-Package Microsoft.Extensions.ApiDescription.Server
Yükleme sonrasında, bu paket derleme sırasında uygulamayla ilişkili Open API belgelerini otomatik olarak oluşturur ve bunları uygulamanın çıkış dizinine doldurur.
$ dotnet build
$ cat bin/Debug/net9.0/{ProjectName}.json
Derleme zamanı belge oluşturmayı özelleştirme
Oluşturulan Open API dosyasının çıkış dizinini değiştirme
Varsayılan olarak, oluşturulan OpenAPI belgesi uygulamanın çıkış dizinine gönderilir. Yayılan dosyanın konumunu değiştirmek için özelliğinde OpenApiDocumentsDirectory
hedef yolu ayarlayın.
<PropertyGroup>
<OpenApiDocumentsDirectory>./</OpenApiDocumentsDirectory>
</PropertyGroup>
değeri OpenApiDocumentsDirectory
proje dosyasına göre çözümlenir. Yukarıdaki değerin ./
kullanılması OpenAPI belgesini proje dosyasıyla aynı dizinde gösterir.
Çıktı dosyasının adını değiştirme
Varsayılan olarak, oluşturulan OpenAPI belgesi uygulamanın proje dosyasıyla aynı ada sahip olur. Yayılan dosyanın adını değiştirmek için özelliğinde bağımsız değişkenini --file-name
OpenApiGenerateDocumentsOptions
ayarlayın.
<PropertyGroup>
<OpenApiGenerateDocumentsOptions>--file-name my-open-api</OpenApiGenerateDocumentsOptions>
</PropertyGroup>
Oluşturulacak OpenAPI belgesini seçme
Bazı uygulamalar, bir API'nin çeşitli sürümleri için birden çok OpenAPI belgesi yayacak veya genel ve iç API'ler arasında ayrım yapmak üzere yapılandırılabilir. Varsayılan olarak, derleme zamanı belge oluşturucu bir uygulamada yapılandırılan tüm belgeler için dosyaları yayar. Yalnızca tek bir belge adını yaymak için özelliğinde bağımsız değişkenini --document-name
OpenApiGenerateDocumentsOptions
ayarlayın.
<PropertyGroup>
<OpenApiGenerateDocumentsOptions>--document-name v2</OpenApiGenerateDocumentsOptions>
</PropertyGroup>
Derleme zamanı belge oluşturma sırasında çalışma zamanı davranışını özelleştirme
Derleme zamanı OpenAPI belge oluşturma işlevi, uygulamanın giriş noktasını eylemsiz bir sunucu uygulamasıyla başlatarak arka planda çalışır. OpenAPI belgesindeki tüm bilgiler statik olarak çözümlenemediğinden, doğru OpenAPI belgeleri oluşturmak için bu bir gereksinimdir. Uygulamanın giriş noktası çağrıldığından, uygulamaların başlangıcındaki tüm mantık çağrılır. Bu, HIZMETLERI DI kapsayıcısına ekleyen veya yapılandırmadan okuyan kodu içerir. Bazı senaryolarda, uygulamanın giriş noktası derleme zamanı belge oluşturma işleminden çağrılırken çalışacak kod yollarının kısıtlanması gerekir. Bu senaryolar şunlardır:
- Bazı yapılandırma dizelerinden okunmuyor.
- Veritabanıyla ilgili hizmetler kaydedilmiyor.
Bu kod yollarının derleme zamanı oluşturma işlem hattı tarafından çağrılmasını kısıtlamak için, aşağıdaki gibi giriş derlemesinin denetiminin arkasına koşullanabilir:
using System.Reflection;
var builder = WebApplication.CreateBuilder();
if (Assembly.GetEntryAssembly()?.GetName().Name != "GetDocument.Insider")
{
builder.Services.AddDefaults();
}
En düşük API'ler, paket aracılığıyla Microsoft.AspNetCore.OpenApi
bir uygulamadaki uç noktalar hakkında bilgi oluşturmak için yerleşik destek sağlar. Oluşturulan OpenAPI tanımını görsel kullanıcı arabirimi aracılığıyla kullanıma sunma, üçüncü taraf bir paket gerektirir. Denetleyici tabanlı API'lerde OpenAPI desteği hakkında bilgi için bu makalenin .NET 9 sürümüne bakın.
Aşağıdaki kod, ASP.NET Core minimal web API'si şablonu tarafından oluşturulur ve OpenAPI kullanır:
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);
}
Yukarıdaki vurgulanan kodda:
Microsoft.AspNetCore.OpenApi
sonraki bölümde açıklanmıştır.- AddEndpointsApiExplorer : Varsayılan ek açıklamalarla uç noktaları bulmak ve açıklamak için uygulamayı API Gezgini'ni kullanacak şekilde yapılandırılır.
WithOpenApi
, API Gezgini tarafından pakettenMicrosoft.AspNetCore.OpenApi
üretilenlerle oluşturulan varsayılan ek açıklamaları geçersiz kılar. UseSwagger
Swagger ara yazılımını ekler.- 'UseSwaggerUI', Swagger UI aracının eklenmiş bir sürümünü etkinleştirir.
- WithNameIEndpointNameMetadata: Uç nokta üzerindeki bağlantı oluşturma için kullanılır ve verilen uç noktanın OpenAPI belirtiminde işlem kimliği olarak değerlendirilir.
WithOpenApi
bu makalenin devamında açıklanmıştır.
Microsoft.AspNetCore.OpenApi
NuGet paketi
ASP.NET Core, uç noktalar için OpenAPI belirtimleriyle etkileşime geçmek için paket sağlar Microsoft.AspNetCore.OpenApi
. Paket, pakette tanımlanan OpenAPI modelleri ile En Düşük API'lerde Microsoft.AspNetCore.OpenApi
tanımlanan uç noktalar arasında bir bağlantı işlevi görür. Paket, uç noktayı açıklamak için kullanılan bir OpenAPI ek açıklama türü oluşturmak için uç noktanın parametrelerini, yanıtlarını ve meta verilerini inceleyen bir API sağlar.
Microsoft.AspNetCore.OpenApi
bir proje dosyasına PackageReference olarak eklenir:
<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>
ile Microsoft.AspNetCore.OpenApi
Swashbuckle.AspNetCore
kullanıldığındaSwashbuckle.AspNetCore
, 6.4.0 veya üzeri kullanılmalıdır. Microsoft.OpenApi
Çağırmalarda WithOpenApi
kopya oluşturuculardan yararlanmak için 1.4.3 veya üzeri kullanılmalıdır.
Aracılığıyla uç noktalara OpenAPI ek açıklamaları ekleme WithOpenApi
Uç noktada çağrılması WithOpenApi
, uç noktanın meta verilerine eklenir. Bu meta veriler şu şekilde olabilir:
- Swashbuckle.AspNetCore gibi üçüncü taraf paketlerde kullanılır.
- Swagger kullanıcı arabiriminde veya API'yi tanımlamak için oluşturulan YAML veya JSON'da görüntülenir.
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();
içinde OpenAPI ek açıklamasını değiştirme WithOpenApi
yöntemi, WithOpenApi
OpenAPI ek açıklamasını değiştirmek için kullanılabilecek bir işlevi kabul eder. Örneğin, aşağıdaki kodda uç noktanın ilk parametresine bir açıklama eklenir:
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;
});
OpenAPI'ye işlem kimlikleri ekleme
İşlem kimlikleri, OpenAPI'de belirli bir uç noktayı benzersiz olarak tanımlamak için kullanılır. WithName
Uzantı yöntemi, bir yöntem için kullanılan işlem kimliğini ayarlamak için kullanılabilir.
app.MapGet("/todoitems2", async (TodoDb db) =>
await db.Todos.ToListAsync())
.WithName("GetToDoItems");
Alternatif olarak, OperationId
özelliği doğrudan OpenAPI ek açıklamasında ayarlanabilir.
app.MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
.WithOpenApi(operation => new(operation)
{
OperationId = "GetTodos"
});
OpenAPI açıklamasına etiket ekleme
OpenAPI, işlemleri kategorilere ayırmak için etiket nesnelerinin kullanılmasını destekler. Bu etiketler genellikle Swagger kullanıcı arabirimindeki işlemleri gruplandırmak için kullanılır. Bu etiketler, uç nokta üzerindeki WithTags uzantısı yöntemi istenen etiketlerle çağrılarak bir işleme eklenebilir.
app.MapGet("/todoitems", async (TodoDb db) =>
await db.Todos.ToListAsync())
.WithTags("TodoGroup");
Alternatif olarak, uzantısı yöntemi aracılığıyla OpenAPI ek açıklamasında WithOpenApi
listesi OpenApiTags
ayarlanabilir.
app.MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
.WithOpenApi(operation => new(operation)
{
Tags = new List<OpenApiTag> { new() { Name = "Todos" } }
});
Uç nokta özeti veya açıklaması ekleme
Uç nokta özeti ve açıklaması, uzantı yöntemi çağrılarak WithOpenApi
eklenebilir. Aşağıdaki kodda özetler doğrudan OpenAPI ek açıklamasında ayarlanır.
app.MapGet("/todoitems2", async (TodoDb db) => await db.Todos.ToListAsync())
.WithOpenApi(operation => new(operation)
{
Summary = "This is a summary",
Description = "This is a description"
});
OpenAPI açıklamasını dışla
Aşağıdaki örnekte, /skipme
uç nokta openAPI açıklaması oluşturmanın dışında tutulur:
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();
API'yi eski olarak işaretleme
Uç noktayı kullanım dışı olarak işaretlemek için, OpenAPI ek açıklamasında özelliğini ayarlayın Deprecated
.
app.MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
.WithOpenApi(operation => new(operation)
{
Deprecated = true
});
Yanıt türlerini açıklama
OpenAPI, API'den döndürülen yanıtların açıklamasını sağlamayı destekler. Minimum API'ler, bir uç noktanın yanıt türünü ayarlamak için üç stratejiyi destekler:
- Uç nokta üzerindeki
Produces
uzantı yöntemi aracılığıyla - Yol işleyicisinde
ProducesResponseType
özniteliği aracılığıyla - Yol işleyicisinden döndürerek
TypedResults
Produces
Uzantı yöntemi, bir uç noktaya meta veri eklemek Produces
için kullanılabilir. Hiçbir parametre sağlanmamışsa, uzantı yöntemi hedeflenen tür için meta verileri bir 200
durum kodu ve application/json
içerik türü altında doldurur.
app
.MapGet("/todos", async (TodoDb db) => await db.Todos.ToListAsync())
.Produces<IList<Todo>>();
Uç noktanın yol işleyicisinin uygulanmasında kullanılması TypedResults
, uç nokta için yanıt türü meta verilerini otomatik olarak içerir. Örneğin, aşağıdaki kod, içerik türüne sahip durum kodu altında 200
bir yanıtla application/json
uç noktaya otomatik olarak açıklama ekler.
app.MapGet("/todos", async (TodoDb db) =>
{
var todos = await db.Todos.ToListAsync());
return TypedResults.Ok(todos);
});
için yanıtları ayarlama ProblemDetails
ProblemDetails yanıtı döndürebilecek uç noktalar için yanıt türünü ayarlarken, uzantı yöntemi ProducesValidationProblemveya TypedResults.Problem
uç noktanın ProducesProblem meta verilerine uygun ek açıklamayı eklemek için kullanılabilir. ve ProducesValidationProblem
uzantısı yöntemlerinin ProducesProblem
.NET 8 ve önceki sürümlerde yol gruplarıyla kullanılamadığını unutmayın.
Yukarıdaki stratejilerden biri tarafından sağlanan açık ek açıklamalar olmadığında, çerçeve yanıtın imzasını inceleyerek varsayılan yanıt türünü belirlemeye çalışır. Bu varsayılan yanıt, OpenAPI tanımındaki 200
durum kodu altında doldurulur.
Birden çok yanıt türü
Bir uç nokta farklı senaryolarda farklı yanıt türleri döndürebiliyorsa meta verileri aşağıdaki yollarla sağlayabilirsiniz:
Produces
Aşağıdaki örnekte gösterildiği gibi uzantı yöntemini birden çok kez çağırın: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);
aşağıdaki örnekte gösterildiği gibi imzada ve
TypedResults
işleyicinin gövdesinde kullanınResults<TResult1,TResult2,TResultN>
: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(); });
Birleşim
Results<TResult1,TResult2,TResultN>
türleri , yol işleyicisinin birden çokIResult
uygulayan somut tür döndürdüğünü ve uygulayanIEndpointMetadataProvider
türlerden herhangi birinin uç noktanın meta verilerine katkıda bulunacağını bildirir.Birleşim türleri örtük atama işleçleri uygular. Bu işleçler, derleyicinin genel bağımsız değişkenlerde belirtilen türleri birleşim türünün bir örneğine otomatik olarak dönüştürmesini sağlar. Bu özellik, bir yol işleyicisinin yalnızca bildirdiği sonuçları döndürdüğüne ilişkin derleme zamanı denetimi sağlama avantajına sahiptir. Derleme hatasıyla sonuçlanması için genel bağımsız değişkenlerden biri olarak bildirlenmemiş bir tür döndürülmeye
Results<TResult1,TResult2,TResultN>
çalışılıyor.
İstek gövdesini ve parametrelerini açıklama
Uç nokta tarafından döndürülen türleri açıklamaya ek olarak, OpenAPI bir API tarafından kullanılan girişlere açıklama eklemeyi de destekler. Bu girişler iki kategoriye ayrılır:
- Yolda, sorgu dizesinde, üst bilgilerde veya tanımlama bilgilerinde görünen parametreler
- İstek gövdesinin bir parçası olarak iletilen veriler
Çerçeve, yol işleyicisinin imzasını temel alarak yol, sorgu ve üst bilgi dizesindeki istek parametrelerinin türlerini otomatik olarak çıkarsar.
İstek gövdesi olarak iletilen girişlerin türünü tanımlamak için, istek işleyicisi tarafından beklenen nesne türünü ve içerik türünü tanımlamak için uzantı yöntemini kullanarak Accepts
özellikleri yapılandırın. Aşağıdaki örnekte, uç nokta istek gövdesinde beklenen içerik türüne application/xml
sahip bir nesne kabul ederTodo
.
app.MapPost("/todos/{id}", (int id, Todo todo) => ...)
.Accepts<Todo>("application/xml");
Uzantı yöntemine Accepts
ek olarak, parametre türü arabirimini uygulayarak IEndpointParameterMetadataProvider
kendi ek açıklamasını açıklayabilir. Örneğin, aşağıdaki Todo
tür içerik türüne sahip bir istek gövdesi gerektiren bir application/xml
ek açıklama ekler.
public class Todo : IEndpointParameterMetadataProvider
{
public static void PopulateMetadata(ParameterInfo parameter, EndpointBuilder builder)
{
builder.Metadata.Add(new ConsumesAttribute(typeof(Todo), isOptional: false, "application/xml"));
}
}
Açık bir ek açıklama sağlanmayan çerçeve, uç nokta işleyicisinde bir istek gövdesi parametresi varsa varsayılan istek türünü belirlemeye çalışır. Çıkarım, ek açıklamayı oluşturmak için aşağıdaki buluşsal yöntemleri kullanır:
- Özniteliği aracılığıyla
[FromForm]
bir formdan okunan istek gövdesi parametreleri içerik türüylemultipart/form-data
açıklanır. - Diğer tüm istek gövdesi parametreleri içerik türüyle
application/json
açıklanır. - İstek gövdesi, null atanabilirse veya özellik özniteliğinde
FromBody
ayarlandıysaAllowEmpty
isteğe bağlı olarak kabul edilir.
API sürümü oluşturma desteği
En düşük API'ler, Asp.Versioning.Http paketi aracılığıyla API sürümü oluşturma desteği sunar. En düşük API'lerle sürüm oluşturma yapılandırma örnekleri API sürüm oluşturma deposunda bulunabilir.
GitHub'da ASP.NET Core OpenAPI kaynak kodu
Ek Kaynaklar
En düşük API uygulaması, Swashbuckle kullanarak yol işleyicileri için OpenAPI belirtimini açıklayabilir.
Denetleyici tabanlı API'lerde OpenAPI desteği hakkında bilgi için bu makalenin .NET 9 sürümüne bakın.
Aşağıdaki kod, OpenAPI desteğine sahip tipik bir ASP.NET Core uygulamasıdır:
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();
OpenAPI açıklamasını dışla
Aşağıdaki örnekte, /skipme
uç nokta openAPI açıklaması oluşturmanın dışında tutulur:
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();
Yanıt türlerini açıklama
Aşağıdaki örnek, yanıtı özelleştirmek için yerleşik sonuç türlerini kullanır:
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);
OpenAPI'ye işlem kimlikleri ekleme
app.MapGet("/todoitems2", async (TodoDb db) =>
await db.Todos.ToListAsync())
.WithName("GetToDoItems");
OpenAPI açıklamasına etiket ekleme
Aşağıdaki kod bir OpenAPI gruplandırma etiketi kullanır:
app.MapGet("/todoitems", async (TodoDb db) =>
await db.Todos.ToListAsync())
.WithTags("TodoGroup");
ASP.NET Core