Aracılığıyla paylaş


ASP.NET Core uygulamasına OpenAPI meta verilerini ekleme

Bu makalede, ASP.NET Core uygulamasında OpenAPI meta verilerinin nasıl ekleneceği açıklanmaktadır.

Uç noktalar için OpenAPI meta verilerini ekleme

ASP.NET web uygulamasının uç noktalarından meta verileri toplar ve bunu kullanarak bir OpenAPI belgesi oluşturur.

Denetleyici tabanlı uygulamalarda meta veriler , [EndpointDescription]gibi [HttpPost]özniteliklerden ve [Produces] denetleyici özniteliğine[ApiController] sahip olduğunda toplanır.

En düşük API'lerde meta veriler özniteliklerden toplanabilir, ancak yol işleyicilerinden döndürme TypedResults gibi uzantı yöntemleri ve diğer stratejiler kullanılarak da ayarlanabilir.

Aşağıdaki tabloda, toplanan meta veriler ve ayarlama stratejilerine genel bir bakış sağlanmaktadır.

Meta veri Öznitelik Uzantı yöntemi Diğer stratejiler
Özet [EndpointSummary] WithSummary
açıklama [EndpointDescription] WithDescription
etiketler [Tags] WithTags
operationId (İşlem Kimliği) [EndpointName] WithName
parametreler [FromQuery], [FromRoute], [FromHeader], [FromForm]
parametre açıklaması [Description]
requestBody [FromBody] Accepts
Yanıt [Produces] Produces, ProducesProblem TypedResults
Uç noktaları hariç tutma [ExcludeFromDescription], [ApiExplorerSettings] ExcludeFromDescription

ASP.NET Core, XML belge açıklamalarından meta verileri de toplayabilir. Daha fazla bilgi için ASP.NET Core'da OpenAPI XML belgeleme yorum desteğine bakın.

Aşağıdaki bölümlerde, oluşturulan OpenAPI belgesini özelleştirmek için bir uygulamaya meta verilerin nasıl ekileceği gösterilmektedir.

Özet ve açıklama

Uç nokta özeti ve açıklaması, [EndpointSummary] ve [EndpointDescription] öznitelikleri kullanılarak veya minimal API'lerde WithSummary ve WithDescription uzantı yöntemleri kullanılarak ayarlanabilir.

Aşağıdaki örnekte özetleri ve açıklamaları ayarlamaya yönelik farklı stratejiler gösterilmektedir.

Özniteliklerin app.MapGet yöntemine değil, temsilci yöntemine yerleştirildiğini unutmayın.

app.MapGet("/extension-methods", () => "Hello world!")
    .WithSummary("This is a summary.")
    .WithDescription("This is a description.");

app.MapGet("/attributes",
    [EndpointSummary("This is a summary.")]
    [EndpointDescription("This is a description.")]
    () => "Hello world!");

etiketler

OpenAPI, her uç noktada etiketleri kategorilere ayırma biçimi olarak belirtmeyi destekler.

Minimum API'lerde etiketler ya `[Tags]` özniteliğiyle ya da `WithTags` uzantı yöntemiyle ayarlanabilir.

Aşağıdaki örnekte etiketleri ayarlamaya yönelik farklı stratejiler gösterilmektedir.

app.MapGet("/extension-methods", () => "Hello world!")
    .WithTags("todos", "projects");

app.MapGet("/attributes",
    [Tags("todos", "projects")]
    () => "Hello world!");

operationId (İşlem Kimliği)

OpenAPI, her uç noktada işlem için benzersiz bir tanımlayıcı veya ad olarak bir operationId'yi destekler.

Minimum API'lerde ya [EndpointName] özniteliğini ya da WithName uzantı yöntemini kullanarak operationId ayarlanabilir.

Aşağıdaki örnekte operationId değerini ayarlamaya yönelik farklı stratejiler gösterilmektedir.

app.MapGet("/extension-methods", () => "Hello world!")
    .WithName("FromExtensionMethods");

app.MapGet("/attributes",
    [EndpointName("FromAttributes")]
    () => "Hello world!");

parametreler

OpenAPI, bir API tarafından kullanılan yol, sorgu dizesi, üst bilgi ve cookie parametrelere açıklama eklemeyi destekler.

Çerçeve, yol işleyicisinin imzasını temel alarak istek parametrelerinin türlerini otomatik olarak çıkarsar.

[Description] özniteliği, bir parametre için açıklama sağlamak için kullanılabilir.

[Description] özniteliği bir MVC uygulamasında çalışır ancak bu, şu anda Minimal API uygulamasında çalışmaz. Daha fazla bilgi için bkz. Description parametresi ProducesResponseTypeAttribute minimal API uygulamasında çalışmıyor (dotnet/aspnetcore #60518)

İstek gövdesini tanımla

requestBody OpenAPI'deki alan, desteklenen içerik türleri ve gövde içeriğinin şeması dahil olmak üzere bir API istemcisinin sunucuya gönderebileceği bir isteğin gövdesini açıklar.

Uç nokta işleyici yöntemi, istek gövdesinden bağlanan parametreleri kabul ettiğinde, ASP.NET Core, OpenAPI belgesindeki işlem için karşılık gelen bir requestBody oluşturur. İstek gövdesi için meta veriler, öznitelikler veya uzantı yöntemleri kullanılarak da belirtilebilir. Ek meta veriler bir belge transformatörü veya işlem transformatörü ile ayarlanabilir.

Uç nokta, istek gövdesine bağlı parametre tanımlamaz ancak bunun yerine doğrudan istek gövdesini HttpContext kullanırsa ASP.NET Core, istek gövdesi meta verilerini belirtmek için mekanizmalar sağlar. Bu, istek gövdesini akış olarak işleyen uç noktalar için yaygın bir senaryodur.

Bazı istek gövdesi meta verileri, yol işleyici yönteminin FromBody veya FromForm parametrelerinden belirlenebilir.

İstek gövdesi için bir açıklama, bir parametredeki [Description] özniteliği kullanılarak FromBody veya FromForm ile ayarlanabilir.

FromBody Parametresi null olmamalıysa ve EmptyBodyBehaviorAllow özelliğinde FromBody olarak ayarlanmamışsa, istek gövdesi gereklidir ve required'nin requestBody alanı oluşturulan OpenAPI belgesinde true olarak ayarlanır. Form gövdeleri her zaman gereklidir ve required, true olarak ayarlanmıştır.

" doküman çeviricisi veya işlem çeviricisi kullanarak, example, examples veya encoding alanlarını ayarlayın ya da üretilen OpenAPI belgesinde istek gövdesi için özel uzantılar ekleyin."

İstek gövdesi meta verilerini ayarlamaya yönelik diğer mekanizmalar, geliştirilmekte olan uygulamanın türüne bağlıdır ve aşağıdaki bölümlerde açıklanmıştır.

Oluşturulan OpenAPI belgesindeki istek gövdesinin içerik türleri, istek gövdesine bağlı olan veya uzantı yöntemiyle belirtilen parametrenin türünden Accepts belirlenir. Varsayılan olarak, bir FromBody parametrenin içerik türü ve application/json parametrelerin içerik türü FromForm veya multipart/form-dataolurapplication/x-www-form-urlencoded.

Bu varsayılan içerik türleri için destek En Düşük API'lerde yerleşiktir ve diğer içerik türleri özel bağlama kullanılarak işlenebilir. Minimal API'lerin belgelerindeki Özel bağlama bölümüne daha fazla bilgi için bakın.

İstek gövdesi için farklı bir içerik türü belirtmenin çeşitli yolları vardır. Eğer FromBody parametresinin türü IEndpointParameterMetadataProvider'i uygularsa, ASP.NET Core bu arabirimi istek gövdesindeki içerik türlerini belirlemek için kullanır. Çerçeve, bu arabirimin PopulateMetadata yöntemini kullanarak istek gövdesinin gövde içeriğinin içerik tür(leri)ni ve türünü ayarlar. Örneğin, Todo veya application/xml içerik türünü kabul eden bir text/xml sınıfı, bu bilgiyi çerçeveye sağlamak için IEndpointParameterMetadataProvider kullanabilir.

public class Todo : IEndpointParameterMetadataProvider
{
    public static void PopulateMetadata(
        ParameterInfo parameter,
        EndpointBuilder builder)
    {
        builder.Metadata.Add(
            new AcceptsMetadata(
                ["application/xml", "text/xml"], 
                typeof(Todo)
            )
        );
    }
}

Accepts Uzantı yöntemi, istek gövdesinin içerik türünü belirtmek için de kullanılabilir. Aşağıdaki örnekte, uç nokta istek gövdesinde beklenen içerik türüne Todosahip bir nesne kabul ederapplication/xml.

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

application/xml yerleşik bir içerik türü olmadığından, Todo sınıfı, istek gövdesi için özel bir bağlama sağlamak amacıyla IBindableFromHttpContext<TSelf> arabirimini uygulamalıdır. Örneğin:

public class Todo : IBindableFromHttpContext<Todo>
{
    public static async ValueTask<Todo?> BindAsync(
        HttpContext context, 
        ParameterInfo parameter)
    {
        var xmlDoc = await XDocument.LoadAsync(context.Request.Body, LoadOptions.None, context.RequestAborted);
        var serializer = new XmlSerializer(typeof(Todo));
        return (Todo?)serializer.Deserialize(xmlDoc.CreateReader());
    }
}

Uç nokta, istek gövdesine bağlı parametre tanımlamıyorsa, uç noktanın Accepts kabul ettiğini içerik türünü belirtmek için uzantı yöntemini kullanın.

AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.Accepts%2A'yı< birden çok kez belirtirseniz>, yalnızca son meta veriler kullanılır; bunlar birleştirilmemiştir.

Yanıt türlerini açıklama

OpenAPI, API'den döndürülen yanıtların açıklamasını sağlamayı destekler. ASP.NET Core, bir uç noktanın yanıt meta verilerini ayarlamak için çeşitli stratejiler sağlar. Ayarlanabilen yanıt meta verileri durum kodunu, yanıt gövdesinin türünü ve yanıtın içerik türlerini içerir. OpenAPI'deki yanıtlarda açıklama, üst bilgiler, bağlantılar ve örnekler gibi ek meta veriler bulunabilir. Bu ek meta veriler bir belge transformatörü veya işlem transformatörü ile ayarlanabilir.

Yanıt meta verilerini ayarlamaya yönelik belirli mekanizmalar, geliştirilmekte olan uygulamanın türüne bağlıdır.

En Düşük API uygulamalarında ASP.NET Core, uç noktadaki uzantı yöntemleri, yol işleyicisindeki öznitelikler ve yol işleyicisinin dönüş türü tarafından eklenen yanıt meta verilerini ayıklayabilir.

  • Uzantı Produces yöntemi, durum kodunu, yanıt gövdesinin türünü ve bir uç noktadan gelen yanıtın içerik türlerini belirtmek için uç noktada kullanılabilir.
  • [ProducesResponseType] veya ProducesResponseTypeAttribute<T> özniteliği, yanıt gövdesinin türünü belirtmek için kullanılabilir.
  • Yol işleyicisi, yanıt gövdesinin türünü ve içerik türlerini belirtmek için IEndpointMetadataProvider uygulayan bir tür döndürmek amacıyla kullanılabilir.
  • ProducesProblem Uç nokta üzerindeki uzantı yöntemi, bir hata yanıtının durum kodunu ve içerik türlerini belirtmek için kullanılabilir.

Produces ve ProducesProblem uzantısı yöntemlerinin hem RouteHandlerBuilder hem de RouteGroupBuilder üzerinde desteklendiğini unutmayın. Bu, örneğin bir gruptaki tüm işlemler için ortak bir hata yanıtları kümesinin tanımlanmasını sağlar.

Önceki stratejilerden biri tarafından belirtilmediğinde, şu durum meydana gelir:

  • Yanıt için durum kodu varsayılan olarak 200'dır.
  • Yanıt gövdesi şeması, uç nokta yönteminin örtük veya açık dönüş türünden( örneğin, T içinden Task<TResult>) çıkarılabilir; aksi takdirde belirtilmemiş olarak kabul edilir.
  • Belirtilen veya çıkarsanan yanıt gövdesi için içerik türü "application/json" şeklindedir.

En Düşük API'lerde uzantı Produces yöntemi ve [ProducesResponseType] özniteliği yalnızca uç nokta için yanıt meta verilerini ayarlar. Uç noktanın davranışını değiştirmez veya kısıtlamaz; bu da meta veriler tarafından belirtilenden farklı bir durum kodu veya yanıt gövdesi türü döndürebilir ve içerik türü, özniteliklerde veya uzantı yöntemlerinde belirtilen içerik türünden bağımsız olarak yol işleyici yönteminin dönüş türü tarafından belirlenir.

Produces Uzantı yöntemi, varsayılan durum kodu 200 ve varsayılan içerik türü olan bir uç noktanın yanıt türünü application/jsonbelirtebilir. Aşağıdaki örnekte bu gösterilmektedir:

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

bir [ProducesResponseType] uç noktaya yanıt meta verileri eklemek için kullanılabilir. Özniteliğin, aşağıdaki örnekte gösterildiği gibi yolu oluşturmak için yöntem çağırma yöntemine değil yol işleyici yöntemine uygulandığını unutmayın:

app.MapGet("/todos",
    [ProducesResponseType<List<Todo>>(200)]
    async (TodoDb db) => await db.Todos.ToListAsync());

[ProducesResponseType], [Produces]ve [ProducesDefaultResponseType] ayrıca yanıtı açıklamak için kullanılabilecek adlı Description isteğe bağlı bir dize özelliğini destekler. Bu, istemcilerin neden veya ne zaman belirli bir yanıt bekleyebileceğini açıklamak için yararlıdır:

app.MapGet("/todos/{id}",
    [ProducesResponseType<Todo>(200, 
        Description = "Returns the requested Todo item.")]
    [ProducesResponseType(404, Description = "Requested item not found.")]
    [ProducesDefault(Description = "Undocumented status code.")]
    async (int id, TodoDb db) => /* Code here */);

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, 200 durum koduyla ve application/json içerik türünde bir yanıtı uç noktaya otomatik olarak açıklama olarak ekler.

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

Yalnızca OpenAPI belgesinde bir IEndpointMetadataProvider girdisi oluşturan dönüş türleri responses uygular. Aşağıda, TypedResults girdi oluşturan bazı yardımcı yöntemlerin responses kısmi listesi yer alıyor.

TypedResults yardımcı yöntemi Durum kodu
Ok() 200
Oluşturuldu() 201
RotaÜzerindeOluşturuldu() 201
Kabul edildi 202
AcceptedAtRoute() 202
İçerik Yok 204
BadRequest() 400
ValidationProblem() 400
Bulunamadı() 404
Çatışma() 409
UnprocessableEntity() // İşlenemeyen Varlık 422

NoContent hariç diğer tüm bu yöntemlerin, yanıt gövdesinin türünü belirten genel bir aşırı yüklemesi vardır.

Uç nokta meta verilerini ayarlamak ve yol işleyicisinden döndürmek için bir sınıf uygulanabilir.

Yanıtları ProblemDetails için ayarla

ProblemDetails yanıtı döndürebilecek uç noktaların yanıt türünü ayarlarken, uç nokta için uygun yanıt meta verilerini eklemek için aşağıdakiler kullanılabilir:

Minimal API uygulamasını ProblemDetails yanıtları döndürecek şekilde yapılandırma hakkında daha fazla bilgi için, Minimal API'lerde hataları yönetme bölümüne bakın.

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, Results<TResult1,TResult2,TResult3,TResult4,TResult5,TResult6> imzada ve TypedResults işleyicinin gövdesinde kullanın.

    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, bir yol işleyicisinin birden fazla IResult uygulayan somut tür döndürdüğünü bildirir. Bu somut türlerin herhangi biri IEndpointMetadataProvider uyguluyorsa, uç noktanın meta verilerine katkı sağlar.

    Birleşim türleri örtük dönüştürme operatörleri kullanır. 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. Genel bağımsız değişkenlerden biri olarak bildirilmemiş bir tür döndürmeye çalışmak, Results<TResult1,TResult2,TResultN> derleme hatası ile sonuçlanır.

Uç noktaları oluşturulan belgenin dışında tutma

Varsayılan olarak, bir uygulamada tanımlanan tüm uç noktalar oluşturulan OpenAPI dosyasında belgelenir, ancak uç noktalar öznitelikler veya uzantı yöntemleri kullanılarak belgenin dışında tutulabilir.

Dışlanması gereken bir uç nokta belirtme mekanizması, geliştirilmekte olan uygulamanın türüne bağlıdır.

Minimum API'ler, belirli bir uç noktayı OpenAPI belgesinden dışlamak için iki stratejiyi destekler:

Aşağıdaki örnek, belirli bir uç noktayı oluşturulan OpenAPI belgesinden dışlamak için farklı stratejileri gösterir.

app.MapGet("/extension-method", () => "Hello world!")
    .ExcludeFromDescription();

app.MapGet("/attributes",
    [ExcludeFromDescription]
    () => "Hello world!");

Veri türleri için OpenAPI meta verilerini dahil et

İstek veya yanıt gövdelerinde kullanılan C# sınıfları veya kayıtları, oluşturulan OpenAPI belgesinde şema olarak temsil edilir. Varsayılan olarak, şemada yalnızca genel özellikler temsil edilir, ancak JsonSerializerOptions alanlar için şema özellikleri de oluşturulur.

PropertyNamingPolicy deve sırtı stili olarak ayarlandığında (ASP.NET web uygulamalarında varsayılan değerdir), şemadaki özellik adları, sınıf veya kayıt özellik adının deve sırtı stilinde biçimidir. , [JsonPropertyName] şemadaki özelliğin adını belirtmek için tek bir özellikte kullanılabilir.

tür ve biçim

Sayısal türler

JSON Şema kitaplığı, standart C# sayısal türlerini OpenAPI type ve format ile eşler ve uygulamada kullanılan NumberHandling'ün JsonSerializerOptions özelliği temel alınarak eşleştirmeyi gerçekleştirir. ASP.NET Core Web API uygulamalarında bu özelliğin varsayılan değeridir JsonNumberHandling.AllowReadingFromString.

NumberHandling özelliği olarak ayarlandığındaJsonNumberHandling.AllowReadingFromString, sayısal türler aşağıdaki gibi eşlenir:

C# Türü OpenAPI type OpenAPI format Diğer onaylar
Int [tamsayı,dize] int32 desen <digits>
uzun [tamsayı,dize] int64 desen <digits>
kısa [tamsayı,dize] int16 desen <digits>
bayt [tamsayı,dize] uint8 desen <digits>
yüzer [sayı,dize] yüzer desen <digits with decimal >
çift [sayı,dize] çift desen <digits with decimal >
ondalık [sayı,dize] çift desen <digits with decimal >

Uygulama, type alanının dizi değerine sahip olamayacağı şekilde OpenAPI 3.0 veya OpenAPI v2 belgeleri üretecek şekilde yapılandırılmışsa, type alanı bırakılır.

NumberHandling özelliği olarak ayarlandığındaJsonNumberHandling.Strict, sayısal türler aşağıdaki gibi eşlenir:

C# Türü OpenAPI type OpenAPI format
Int tamsayı int32
uzun tamsayı int64
kısa tamsayı int16
bayt tamsayı uint8
yüzer Numara yüzer
çift Numara çift
ondalık Numara çift

Dize türleri

Aşağıdaki tabloda, C# türlerinin oluşturulan OpenAPI belgesindeki tür özellikleriyle string nasıl eşleniği gösterilmektedir:

C# Türü OpenAPI type OpenAPI format Diğer onaylar
Dize Dize
Char Dize Char minLength: 1, maxLength: 1
bayt[] Dize bayt
TarihSaatOfset Dize tarih-saat
Sadece Tarih Dize tarih
TimeOnly Dize zaman
Urı Dize URI
GUID Dize UUID (evrensel benzersiz tanımlayıcı)

Diğer türler

Diğer C# türleri, aşağıdaki tabloda gösterildiği gibi oluşturulan OpenAPI belgesinde temsil edilir:

C# Türü OpenAPI type OpenAPI format
boolean Boolean
nesne Çıkarıldı
dinamik Çıkarıldı

Meta veri eklemek için öznitelikleri kullanma

ASP.NET, oluşturulan şemanın ilgili özelliklerinde meta verileri ayarlamak için sınıf veya kayıt özelliklerindeki özniteliklerden meta verileri kullanır.

Aşağıdaki tabloda, System.ComponentModel ad alanından sağlanan ve oluşturulan şema için meta veriler içeren öznitelikler özetlenmiştir.

Öznitelik Açıklama
[Description] Şemadaki description bir özelliğin değerini ayarlar.
[Required] Bir özelliği şemada olarak required işaretler.
[DefaultValue] Şemadaki default bir özelliğin değerini ayarlar.
[Range] Bir tamsayının veya sayının minimum ve maximum değerini ayarlar.
[MinLength] Bir dizenin minLength'sını veya bir dizinin minItems'ini ayarlar.
[MaxLength] Bir dizenin maxLength'sını veya bir dizinin maxItems'ini ayarlar.
[RegularExpression] Karakter dizisinin pattern değerini ayarlar.

Denetleyici tabanlı uygulamalarda, bu özniteliklerin gelen verilerin kısıtlamaları karşıladığını doğrulamak için işleme filtreler eklediğini unutmayın. En Düşük API'lerde, bu öznitelikler oluşturulan şemadaki meta verileri ayarlar, ancak doğrulamanın bir uç nokta filtresi, yol işleyicisinin mantığı veya üçüncü taraf paket aracılığıyla açıkça gerçekleştirilmesi gerekir.

Öznitelikler, kayıt tanımının parametre listesindeki parametrelere de yerleştirilebilir, ancak değiştiriciyi property içermelidir. Örneğin:

public record Todo(
    [property: Required]
    [property: Description("The unique identifier for the todo")]
    int Id,
    [property: Description("The title of the todo")]
    [property: MaxLength(120)]
    string Title,
    [property: Description("Whether the todo has been completed")]
    bool Completed
) {}

Oluşturulan şemalar için diğer meta veri kaynakları

gerekli

Bir sınıfta, yapıda veya kayıtta, özniteliğine veya gerekli değiştiriciye [Required] sahip özellikler her zaman ilgili şemadadır.required

Sınıf, yapı veya kayıt için oluşturuculara (örtük ve açık) göre diğer özellikler de gerekli olabilir.

  • Tek bir ortak oluşturucuya sahip bir sınıf veya kayıt sınıfı için, oluşturucuya parametre olarak aynı tür ve isme sahip (büyük/küçük harf eşleşmelerine duyarsız) herhangi bir özellik, ilgili şemada gereklidir.
  • Birden çok ortak oluşturucuya sahip bir sınıf veya kayıt sınıfı için başka bir özellik gerekmez.
  • Bir yapı veya kayıt yapısı için, C# her zaman bir yapı için örtük parametresiz oluşturucu tanımladığından başka hiçbir özellik gerekmez.

sabit listesi

C#'daki enum türleri tamsayı tabanlıdır, ancak JSON'da bir [JsonConverter] ve bir JsonStringEnumConverter olarak dizeler şeklinde gösterilebilir. Bir sabit listesi türü JSON'da bir dize olarak temsil edildiğinde, oluşturulan şemanın sabit listesi dize değerlerine sahip bir enum özelliği olur.

JSON'da bir enum'u dize olarak göstermek için bir JsonStringEnumConverter'nın nasıl kullanılacağını aşağıdaki örnek göstermektedir:

[JsonConverter(typeof(JsonStringEnumConverter<DayOfTheWeekAsString>))]
public enum DayOfTheWeekAsString
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

Bir sabit listesi türünün, sabit listesinin bit alanı olarak ele alınabileceğini belirten [Flags] özniteliğine sahip olması özel bir durumdur; yani bir dizi bayrak. ile enum bayraklar[JsonConverterAttribute], özelliği olmayan type: string oluşturulan şemada olarak enum tanımlanır. enum özelliği oluşturulmaz çünkü değer, sabit liste değerlerinin herhangi bir kombinasyonu olabilir. Örneğin, aşağıdakiler enum veya "Pepperoni, Sausage"gibi "Sausage, Mushrooms, Anchovies" değerlere sahip olabilir:

[Flags, JsonConverter(typeof(JsonStringEnumConverter<PizzaToppings>))]
public enum PizzaToppings { 
    Pepperoni = 1,
    Sausage = 2,
    Mushrooms = 4,
    Anchovies = 8
}

[JsonConverter] içermeyen bir sabit listesi türü, oluşturulan şemada type: integer olarak tanımlanır.

Not:[AllowedValues] özniteliği bir özelliğin enum değerlerini ayarlamaz.

JSON seçeneklerini global olarak ayarlayın, JsonStringEnumConverter nasıl ayarlayacağınızı gösterir.

null olabilir

Null atanabilir değer veya başvuru türü olarak tanımlanan özellikler, oluşturulan şemada type anahtar sözcüğü ile görüntülenir; bu anahtar sözcüğünün değeri null türlerinden birini içeren bir dizi olarak görünür. Bu, null atanabilir bir özellik için System.Text.Json'i geçerli bir değer olarak kabul eden null seri durumdan çıkarıcının varsayılan davranışıyla tutarlıdır.

Örneğin, olarak string? tanımlanan bir C# özelliği oluşturulan şemada şu şekilde gösterilir:

  "nullableString": {
    "description": "A property defined as string?",
    "type": [
      "null",
      "string"
    ]
  },

Uygulama, OpenAPI v3.0 veya OpenAPI v2 belgeleri üretecek şekilde yapılandırılmışsa, null atanabilir değer veya başvuru türleri, oluşturulan şemada nullable: true ile temsil edilir çünkü bu OpenAPI sürümleri type alanının bir dizi olmamasını gerektirir.

ek özellikler

Şemalar varsayılan olarak bir additionalProperties onayı olmadan oluşturulur ve bu, varsayılan olarak true anlamına gelir. Bu, bir JSON nesnesindeki ek özellikleri sessizce görmezden gelen System.Text.Json çözücüsünün varsayılan davranışıyla tutarlıdır.

Bir şemanın ek özellikleri yalnızca belirli bir türde değerlere sahip olmalıdır, özelliğini veya sınıfını olarak Dictionary<string, type>tanımlayın. Sözlüğün anahtar türü olmalıdır string. Bir additionalProperties şema oluşturarak "tür" için gerekli değer tipleri olarak şemayı belirler.

Polimorfik türler

Çok biçimli bir türün ayırıcı alanını ve alt türlerini belirtmek için üst sınıftaki [JsonPolymorphic] ve [JsonDerivedType] özniteliklerini kullanın.

[JsonDerivedType], her alt sınıf için ayrımcı alanını şemaya ekler ve alt sınıf için belirli ayrımcı değeri belirten bir enum ekler. Bu öznitelik, ayrıştırıcı değerini ayarlamak için türetilmiş her sınıfın oluşturucusunu da değiştirir.

Özniteliği olan soyut bir [JsonPolymorphic] sınıfın şemada bir discriminator alanı vardır, ancak bir [JsonPolymorphic] özniteliği olan somut sınıfın şemada discriminator alanı yoktur. OpenAPI, ayrımcı özelliğinin şemada gerekli bir özellik olmasını gerektirir, ancak ayırıcı özelliği somut temel sınıfta tanımlanmadığından şema bir discriminator alan içeremez.

Şema dönüştürücü ile meta veri ekleme

Şema transformatörü, varsayılan meta verileri geçersiz kılmak veya oluşturulan şemaya değerler gibi example ek meta veriler eklemek için kullanılabilir. Daha fazla bilgi için bkz . Şema dönüştürücülerini kullanma.

JSON serileştirme seçeneklerini genel olarak ayarlama

Aşağıdaki kod, Minimum API'ler ve Denetleyici tabanlı API'ler için genel olarak bazı JSON seçeneklerini yapılandırmaktadır:

using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http.Json;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddOpenApi();

builder.Services.Configure<JsonOptions>(options =>
{
    options.SerializerOptions.Converters.Add(
        new JsonStringEnumConverter<DayOfTheWeekAsString>());
    options.SerializerOptions.DefaultIgnoreCondition =
        JsonIgnoreCondition.WhenWritingNull;
    options.SerializerOptions.PropertyNamingPolicy =
        JsonNamingPolicy.CamelCase;

});

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(
            new JsonStringEnumConverter<DayOfTheWeekAsString>());
        options.JsonSerializerOptions.DefaultIgnoreCondition =
            JsonIgnoreCondition.WhenWritingNull;
        options.JsonSerializerOptions.PropertyNamingPolicy =
            JsonNamingPolicy.CamelCase;
    });

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.MapOpenApi();
}

app.UseHttpsRedirection();

app.MapGet("/", () =>
{
    var day = DayOfTheWeekAsString.Friday;
    return Results.Json(day);
});

app.MapPost("/", (DayOfTheWeekAsString day) =>
{
    return Results.Json($"Received: {day}");
});

app.UseRouting();
app.MapControllers();

app.Run();

MVC JSON seçenekleri ve genel JSON seçenekleri

Aşağıdaki tabloda, MVC JSON seçenekleri ve genel Minimal API JSON seçenekleri arasındaki temel farklar gösterilmektedir:

Görünüm MVC JSON Seçenekleri Genel JSON Seçenekleri
Kapsam MVC denetleyicileri ve uç noktalarıyla sınırlıdır. Minimal API'ler ve OpenAPI belgeleri.
Yapılandırma AddControllers().AddJsonOptions() Configure<JsonOptions>()
Amaç API'lerdeki JSON isteklerinin ve yanıtlarının serileştirmesini ve seri durumdan çıkarma işlemlerini işler. Minimum API'ler ve OpenAPI şemaları için genel JSON işlemesini tanımlar.
OpenAPI üzerindeki etkisi Hiç kimse OpenAPI şeması oluşturmayı doğrudan etkiler.

Ek kaynaklar

ASP.NET web uygulamasının uç noktalarından meta verileri toplar ve bunu kullanarak bir OpenAPI belgesi oluşturur.

Denetleyici tabanlı uygulamalarda meta veriler , [EndpointDescription]gibi [HttpPost]özniteliklerden ve [Produces] denetleyici özniteliğine[ApiController] sahip olduğunda toplanır.

En düşük API'lerde meta veriler özniteliklerden toplanabilir, ancak yol işleyicilerinden döndürme TypedResults gibi uzantı yöntemleri ve diğer stratejiler kullanılarak da ayarlanabilir.

Aşağıdaki tabloda, toplanan meta veriler ve ayarlama stratejilerine genel bir bakış sağlanmaktadır.

Meta veri Öznitelik Uzantı yöntemi Diğer stratejiler
Özet [EndpointSummary] WithSummary
açıklama [EndpointDescription] WithDescription
etiketler [Tags] WithTags
operationId (İşlem Kimliği) [EndpointName] WithName
parametreler [FromQuery], [FromRoute], [FromHeader], [FromForm]
parametre açıklaması [Description]
requestBody [FromBody] Accepts
Yanıt [Produces] Produces, ProducesProblem TypedResults
Uç noktaları hariç tutma [ExcludeFromDescription], [ApiExplorerSettings] ExcludeFromDescription

ASP.NET Core, XML belge açıklamalarından meta verileri toplamaz.

Aşağıdaki bölümlerde, oluşturulan OpenAPI belgesini özelleştirmek için bir uygulamaya meta verilerin nasıl ekileceği gösterilmektedir.

Özet ve açıklama

Uç nokta özeti ve açıklaması, [EndpointSummary] ve [EndpointDescription] öznitelikleri kullanılarak veya minimal API'lerde WithSummary ve WithDescription uzantı yöntemleri kullanılarak ayarlanabilir.

Aşağıdaki örnekte özetleri ve açıklamaları ayarlamaya yönelik farklı stratejiler gösterilmektedir.

Özniteliklerin app.MapGet yöntemine değil, temsilci yöntemine yerleştirildiğini unutmayın.

app.MapGet("/extension-methods", () => "Hello world!")
    .WithSummary("This is a summary.")
    .WithDescription("This is a description.");

app.MapGet("/attributes",
    [EndpointSummary("This is a summary.")]
    [EndpointDescription("This is a description.")]
    () => "Hello world!");

etiketler

OpenAPI, her uç noktada etiketleri kategorilere ayırma biçimi olarak belirtmeyi destekler.

Minimum API'lerde etiketler ya `[Tags]` özniteliğiyle ya da `WithTags` uzantı yöntemiyle ayarlanabilir.

Aşağıdaki örnekte etiketleri ayarlamaya yönelik farklı stratejiler gösterilmektedir.

app.MapGet("/extension-methods", () => "Hello world!")
    .WithTags("todos", "projects");

app.MapGet("/attributes",
    [Tags("todos", "projects")]
    () => "Hello world!");

operationId (İşlem Kimliği)

OpenAPI, her uç noktada işlem için benzersiz bir tanımlayıcı veya ad olarak bir operationId'yi destekler.

Minimum API'lerde ya [EndpointName] özniteliğini ya da WithName uzantı yöntemini kullanarak operationId ayarlanabilir.

Aşağıdaki örnekte operationId değerini ayarlamaya yönelik farklı stratejiler gösterilmektedir.

app.MapGet("/extension-methods", () => "Hello world!")
    .WithName("FromExtensionMethods");

app.MapGet("/attributes",
    [EndpointName("FromAttributes")]
    () => "Hello world!");

parametreler

OpenAPI, bir API tarafından kullanılan yol, sorgu dizesi, üst bilgi ve cookie parametrelere açıklama eklemeyi destekler.

Çerçeve, yol işleyicisinin imzasını temel alarak istek parametrelerinin türlerini otomatik olarak çıkarsar.

[Description] özniteliği, bir parametre için açıklama sağlamak için kullanılabilir.

[Description] özniteliği bir MVC uygulamasında çalışır ancak bu, şu anda Minimal API uygulamasında çalışmaz. Daha fazla bilgi için bkz. Description parametresi ProducesResponseTypeAttribute minimal API uygulamasında çalışmıyor (dotnet/aspnetcore #60518)

İstek gövdesini tanımla

requestBody OpenAPI'deki alan, desteklenen içerik türleri ve gövde içeriğinin şeması dahil olmak üzere bir API istemcisinin sunucuya gönderebileceği bir isteğin gövdesini açıklar.

Uç nokta işleyici yöntemi, istek gövdesinden bağlanan parametreleri kabul ettiğinde, ASP.NET Core, OpenAPI belgesindeki işlem için karşılık gelen bir requestBody oluşturur. İstek gövdesi için meta veriler, öznitelikler veya uzantı yöntemleri kullanılarak da belirtilebilir. Ek meta veriler bir belge transformatörü veya işlem transformatörü ile ayarlanabilir.

Uç nokta, istek gövdesine bağlı parametre tanımlamaz ancak bunun yerine doğrudan istek gövdesini HttpContext kullanırsa ASP.NET Core, istek gövdesi meta verilerini belirtmek için mekanizmalar sağlar. Bu, istek gövdesini akış olarak işleyen uç noktalar için yaygın bir senaryodur.

Bazı istek gövdesi meta verileri, yol işleyici yönteminin FromBody veya FromForm parametrelerinden belirlenebilir.

İstek gövdesi için bir açıklama, bir parametredeki [Description] özniteliği kullanılarak FromBody veya FromForm ile ayarlanabilir.

FromBody Parametresi null olmamalıysa ve EmptyBodyBehaviorAllow özelliğinde FromBody olarak ayarlanmamışsa, istek gövdesi gereklidir ve required'nin requestBody alanı oluşturulan OpenAPI belgesinde true olarak ayarlanır. Form gövdeleri her zaman gereklidir ve required, true olarak ayarlanmıştır.

" doküman çeviricisi veya işlem çeviricisi kullanarak, example, examples veya encoding alanlarını ayarlayın ya da üretilen OpenAPI belgesinde istek gövdesi için özel uzantılar ekleyin."

İstek gövdesi meta verilerini ayarlamaya yönelik diğer mekanizmalar, geliştirilmekte olan uygulamanın türüne bağlıdır ve aşağıdaki bölümlerde açıklanmıştır.

Oluşturulan OpenAPI belgesindeki istek gövdesinin içerik türleri, istek gövdesine bağlı olan veya uzantı yöntemiyle belirtilen parametrenin türünden Accepts belirlenir. Varsayılan olarak, bir FromBody parametrenin içerik türü ve application/json parametrelerin içerik türü FromForm veya multipart/form-dataolurapplication/x-www-form-urlencoded.

Bu varsayılan içerik türleri için destek En Düşük API'lerde yerleşiktir ve diğer içerik türleri özel bağlama kullanılarak işlenebilir. Minimal API'lerin belgelerindeki Özel bağlama bölümüne daha fazla bilgi için bakın.

İstek gövdesi için farklı bir içerik türü belirtmenin çeşitli yolları vardır. Eğer FromBody parametresinin türü IEndpointParameterMetadataProvider'i uygularsa, ASP.NET Core bu arabirimi istek gövdesindeki içerik türlerini belirlemek için kullanır. Çerçeve, bu arabirimin PopulateMetadata yöntemini kullanarak istek gövdesinin gövde içeriğinin içerik tür(leri)ni ve türünü ayarlar. Örneğin, Todo veya application/xml içerik türünü kabul eden bir text/xml sınıfı, bu bilgiyi çerçeveye sağlamak için IEndpointParameterMetadataProvider kullanabilir.

public class Todo : IEndpointParameterMetadataProvider
{
    public static void PopulateMetadata(ParameterInfo parameter, EndpointBuilder builder)
    {
        builder.Metadata.Add(new AcceptsMetadata(["application/xml", "text/xml"], typeof(Todo)));
    }
}

Accepts Uzantı yöntemi, istek gövdesinin içerik türünü belirtmek için de kullanılabilir. Aşağıdaki örnekte, uç nokta istek gövdesinde beklenen içerik türüne Todosahip bir nesne kabul ederapplication/xml.

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

application/xml yerleşik bir içerik türü olmadığından, Todo sınıfı, istek gövdesi için özel bir bağlama sağlamak amacıyla IBindableFromHttpContext<TSelf> arabirimini uygulamalıdır. Örneğin:

public class Todo : IBindableFromHttpContext<Todo>
{
    public static async ValueTask<Todo?> BindAsync(HttpContext context, ParameterInfo parameter)
    {
        var xmlDoc = await XDocument.LoadAsync(context.Request.Body, LoadOptions.None, context.RequestAborted);
        var serializer = new XmlSerializer(typeof(Todo));
        return (Todo?)serializer.Deserialize(xmlDoc.CreateReader());
    }
}

Uç nokta, istek gövdesine bağlı parametre tanımlamıyorsa, uç noktanın Accepts kabul ettiğini içerik türünü belirtmek için uzantı yöntemini kullanın.

AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.Accepts%2A'yı< birden çok kez belirtirseniz>, yalnızca son meta veriler kullanılır; bunlar birleştirilmemiştir.

Yanıt türlerini açıklama

OpenAPI, API'den döndürülen yanıtların açıklamasını sağlamayı destekler. ASP.NET Core, bir uç noktanın yanıt meta verilerini ayarlamak için çeşitli stratejiler sağlar. Ayarlanabilen yanıt meta verileri durum kodunu, yanıt gövdesinin türünü ve yanıtın içerik türlerini içerir. OpenAPI'deki yanıtlarda açıklama, üst bilgiler, bağlantılar ve örnekler gibi ek meta veriler bulunabilir. Bu ek meta veriler bir belge transformatörü veya işlem transformatörü ile ayarlanabilir.

Yanıt meta verilerini ayarlamaya yönelik belirli mekanizmalar, geliştirilmekte olan uygulamanın türüne bağlıdır.

En Düşük API uygulamalarında ASP.NET Core, uç noktadaki uzantı yöntemleri, yol işleyicisindeki öznitelikler ve yol işleyicisinin dönüş türü tarafından eklenen yanıt meta verilerini ayıklayabilir.

  • Uzantı Produces yöntemi, durum kodunu, yanıt gövdesinin türünü ve bir uç noktadan gelen yanıtın içerik türlerini belirtmek için uç noktada kullanılabilir.
  • [ProducesResponseType] veya ProducesResponseTypeAttribute<T> özniteliği, yanıt gövdesinin türünü belirtmek için kullanılabilir.
  • Yol işleyicisi, yanıt gövdesinin türünü ve içerik türlerini belirtmek için IEndpointMetadataProvider uygulayan bir tür döndürmek amacıyla kullanılabilir.
  • ProducesProblem Uç nokta üzerindeki uzantı yöntemi, bir hata yanıtının durum kodunu ve içerik türlerini belirtmek için kullanılabilir.

Produces ve ProducesProblem uzantısı yöntemlerinin hem RouteHandlerBuilder hem de RouteGroupBuilder üzerinde desteklendiğini unutmayın. Bu, örneğin bir gruptaki tüm işlemler için ortak bir hata yanıtları kümesinin tanımlanmasını sağlar.

Önceki stratejilerden biri tarafından belirtilmediğinde, şu durum meydana gelir:

  • Yanıt için durum kodu varsayılan olarak 200'dır.
  • Yanıt gövdesi şeması, uç nokta yönteminin örtük veya açık dönüş türünden( örneğin, T içinden Task<TResult>) çıkarılabilir; aksi takdirde belirtilmemiş olarak kabul edilir.
  • Belirtilen veya çıkarsanan yanıt gövdesi için içerik türü "application/json" şeklindedir.

En Düşük API'lerde uzantı Produces yöntemi ve [ProducesResponseType] özniteliği yalnızca uç nokta için yanıt meta verilerini ayarlar. Uç noktanın davranışını değiştirmez veya kısıtlamaz; bu da meta veriler tarafından belirtilenden farklı bir durum kodu veya yanıt gövdesi türü döndürebilir ve içerik türü, özniteliklerde veya uzantı yöntemlerinde belirtilen içerik türünden bağımsız olarak yol işleyici yönteminin dönüş türü tarafından belirlenir.

Produces Uzantı yöntemi, varsayılan durum kodu 200 ve varsayılan içerik türü olan bir uç noktanın yanıt türünü application/jsonbelirtebilir. Aşağıdaki örnekte bu gösterilmektedir:

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

bir [ProducesResponseType] uç noktaya yanıt meta verileri eklemek için kullanılabilir. Özniteliğin, aşağıdaki örnekte gösterildiği gibi yolu oluşturmak için yöntem çağırma yöntemine değil yol işleyici yöntemine uygulandığını unutmayın:

app.MapGet("/todos",
    [ProducesResponseType<List<Todo>>(200)]
    async (TodoDb db) => await db.Todos.ToListAsync());

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, 200 durum koduyla ve application/json içerik türünde bir yanıtı uç noktaya otomatik olarak açıklama olarak ekler.

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

Yalnızca OpenAPI belgesinde bir IEndpointMetadataProvider girdisi oluşturan dönüş türleri responses uygular. Aşağıda, TypedResults girdi oluşturan bazı yardımcı yöntemlerin responses kısmi listesi yer alıyor.

TypedResults yardımcı yöntemi Durum kodu
Ok() 200
Oluşturuldu() 201
RotaÜzerindeOluşturuldu() 201
Kabul edildi 202
AcceptedAtRoute() 202
İçerik Yok 204
BadRequest() 400
ValidationProblem() 400
Bulunamadı() 404
Çatışma() 409
UnprocessableEntity() // İşlenemeyen Varlık 422

NoContent hariç diğer tüm bu yöntemlerin, yanıt gövdesinin türünü belirten genel bir aşırı yüklemesi vardır.

Uç nokta meta verilerini ayarlamak ve yol işleyicisinden döndürmek için bir sınıf uygulanabilir.

Yanıtları ProblemDetails için ayarla

ProblemDetails yanıtı döndürebilecek uç noktaların yanıt türünü ayarlarken, uç nokta için uygun yanıt meta verilerini eklemek için aşağıdakiler kullanılabilir:

Minimal API uygulamasını ProblemDetails yanıtları döndürecek şekilde yapılandırma hakkında daha fazla bilgi için, Minimal API'lerde hataları yönetme bölümüne bakın.

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, Results<TResult1,TResult2,TResult3,TResult4,TResult5,TResult6> imzada ve TypedResults işleyicinin gövdesinde kullanın.

    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, bir yol işleyicisinin birden fazla IResult uygulayan somut tür döndürdüğünü bildirir. Bu somut türlerin herhangi biri IEndpointMetadataProvider uyguluyorsa, uç noktanın meta verilerine katkı sağlar.

    Birleşim türleri örtük dönüştürme operatörleri kullanır. 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. Genel bağımsız değişkenlerden biri olarak bildirilmemiş bir tür döndürmeye çalışmak, Results<TResult1,TResult2,TResultN> derleme hatası ile sonuçlanır.

Uç noktaları oluşturulan belgenin dışında tutma

Varsayılan olarak, bir uygulamada tanımlanan tüm uç noktalar oluşturulan OpenAPI dosyasında belgelenir, ancak uç noktalar öznitelikler veya uzantı yöntemleri kullanılarak belgenin dışında tutulabilir.

Dışlanması gereken bir uç nokta belirtme mekanizması, geliştirilmekte olan uygulamanın türüne bağlıdır.

Minimum API'ler, belirli bir uç noktayı OpenAPI belgesinden dışlamak için iki stratejiyi destekler:

Aşağıdaki örnek, belirli bir uç noktayı oluşturulan OpenAPI belgesinden dışlamak için farklı stratejileri gösterir.

app.MapGet("/extension-method", () => "Hello world!")
    .ExcludeFromDescription();

app.MapGet("/attributes",
    [ExcludeFromDescription]
    () => "Hello world!");

Veri türleri için OpenAPI meta verilerini dahil et

İstek veya yanıt gövdelerinde kullanılan C# sınıfları veya kayıtları, oluşturulan OpenAPI belgesinde şema olarak temsil edilir. Varsayılan olarak, şemada yalnızca genel özellikler temsil edilir, ancak JsonSerializerOptions alanlar için şema özellikleri de oluşturulur.

PropertyNamingPolicy deve sırtı stili olarak ayarlandığında (ASP.NET web uygulamalarında varsayılan değerdir), şemadaki özellik adları, sınıf veya kayıt özellik adının deve sırtı stilinde biçimidir. , [JsonPropertyName] şemadaki özelliğin adını belirtmek için tek bir özellikte kullanılabilir.

tür ve biçim

JSON Şema kitaplığı, standart C# türlerini OpenAPI type ile ve format aşağıdaki gibi eşler:

C# Türü OpenAPI type OpenAPI format
Int tamsayı int32
uzun tamsayı int64
kısa tamsayı int16
bayt tamsayı uint8
yüzer Numara yüzer
çift Numara çift
ondalık Numara çift
boolean Boolean
Dize Dize
Char Dize Char
bayt[] Dize bayt
TarihSaatOfset Dize tarih-saat
Sadece Tarih Dize tarih
TimeOnly Dize zaman
Urı Dize URI
GUID Dize UUID (evrensel benzersiz tanımlayıcı)
nesne Çıkarıldı
dinamik Çıkarıldı

Nesne ve dinamik türlerin OpenAPI'de tanımlı türü olmadığını unutmayın çünkü bunlar int veya dize gibi ilkel türler de dahil olmak üzere herhangi bir türde veri içerebilir.

type veformat, şema transformatörü ile de ayarlanabilir. Örneğin, ondalık türlerinin format yerine decimalolmasını double isteyebilirsiniz.

Meta veri eklemek için öznitelikleri kullanma

ASP.NET, oluşturulan şemanın ilgili özelliklerinde meta verileri ayarlamak için sınıf veya kayıt özelliklerindeki özniteliklerden meta verileri kullanır.

Aşağıdaki tabloda, System.ComponentModel ad alanından sağlanan ve oluşturulan şema için meta veriler içeren öznitelikler özetlenmiştir.

Öznitelik Açıklama
[Description] Şemadaki description bir özelliğin değerini ayarlar.
[Required] Bir özelliği şemada olarak required işaretler.
[DefaultValue] Şemadaki default bir özelliğin değerini ayarlar.
[Range] Bir tamsayının veya sayının minimum ve maximum değerini ayarlar.
[MinLength] Bir dizenin minLength'sını veya bir dizinin minItems'ini ayarlar.
[MaxLength] Bir dizenin maxLength'sını veya bir dizinin maxItems'ini ayarlar.
[RegularExpression] Karakter dizisinin pattern değerini ayarlar.

Denetleyici tabanlı uygulamalarda, bu özniteliklerin gelen verilerin kısıtlamaları karşıladığını doğrulamak için işleme filtreler eklediğini unutmayın. En Düşük API'lerde, bu öznitelikler oluşturulan şemadaki meta verileri ayarlar, ancak doğrulamanın bir uç nokta filtresi, yol işleyicisinin mantığı veya üçüncü taraf paket aracılığıyla açıkça gerçekleştirilmesi gerekir.

Öznitelikler, kayıt tanımının parametre listesindeki parametrelere de yerleştirilebilir, ancak değiştiriciyi property içermelidir. Örneğin:

public record Todo(
    [property: Required]
    [property: Description("The unique identifier for the todo")]
    int Id,
    [property: Description("The title of the todo")]
    [property: MaxLength(120)]
    string Title,
    [property: Description("Whether the todo has been completed")]
    bool Completed
) {}

Oluşturulan şemalar için diğer meta veri kaynakları

gerekli

Bir sınıfta, yapıda veya kayıtta, özniteliğine veya gerekli değiştiriciye [Required] sahip özellikler her zaman ilgili şemadadır.required

Sınıf, yapı veya kayıt için oluşturuculara (örtük ve açık) göre diğer özellikler de gerekli olabilir.

  • Tek bir ortak oluşturucuya sahip bir sınıf veya kayıt sınıfı için, oluşturucuya parametre olarak aynı tür ve isme sahip (büyük/küçük harf eşleşmelerine duyarsız) herhangi bir özellik, ilgili şemada gereklidir.
  • Birden çok ortak oluşturucuya sahip bir sınıf veya kayıt sınıfı için başka bir özellik gerekmez.
  • Bir yapı veya kayıt yapısı için, C# her zaman bir yapı için örtük parametresiz oluşturucu tanımladığından başka hiçbir özellik gerekmez.

sabit listesi

C#'daki enum türleri tamsayı tabanlıdır, ancak JSON'da bir [JsonConverter] ve bir JsonStringEnumConverter olarak dizeler şeklinde gösterilebilir. Bir sabit listesi türü JSON'da bir dize olarak temsil edildiğinde, oluşturulan şemanın sabit listesi dize değerlerine sahip bir enum özelliği olur.

JSON'da bir enum'u dize olarak göstermek için bir JsonStringEnumConverter'nın nasıl kullanılacağını aşağıdaki örnek göstermektedir:

[JsonConverter(typeof(JsonStringEnumConverter<DayOfTheWeekAsString>))]
public enum DayOfTheWeekAsString
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

Bir sabit listesi türünün, sabit listesinin bit alanı olarak ele alınabileceğini belirten [Flags] özniteliğine sahip olması özel bir durumdur; yani bir dizi bayrak. [JsonConverterAttribute] içeren bayraklar sabit listesi, oluşturulan şemada type: string özelliği olmayan enum olarak tanımlanır çünkü değer sabit listesi değerlerinin herhangi bir bileşimi olabilir. Örneğin, aşağıdaki enumerasyon:

[Flags, JsonConverter(typeof(JsonStringEnumConverter<PizzaToppings>))]
public enum PizzaToppings { Pepperoni = 1, Sausage = 2, Mushrooms = 4, Anchovies = 8 }

veya "Pepperoni, Sausage"gibi "Sausage, Mushrooms, Anchovies" değerlere sahip olabilir.

[JsonConverter] içermeyen bir sabit listesi türü, oluşturulan şemada type: integer olarak tanımlanır.

Not:[AllowedValues] özniteliği bir özelliğin enum değerlerini ayarlamaz.

null olabilir

Null atanabilir değer veya referans türü olarak tanımlanan özellikler oluşturulan şemada nullable: true olarak görünür. Bu, null atanabilir bir özellik için System.Text.Json'i geçerli bir değer olarak kabul eden null seri durumdan çıkarıcının varsayılan davranışıyla tutarlıdır.

ek özellikler

Şemalar varsayılan olarak bir additionalProperties onayı olmadan oluşturulur ve bu, varsayılan olarak true anlamına gelir. Bu, bir JSON nesnesindeki ek özellikleri sessizce görmezden gelen System.Text.Json çözücüsünün varsayılan davranışıyla tutarlıdır.

Bir şemanın ek özellikleri yalnızca belirli bir türde değerlere sahip olmalıdır, özelliğini veya sınıfını olarak Dictionary<string, type>tanımlayın. Sözlüğün anahtar türü olmalıdır string. Bir additionalProperties şema oluşturarak "tür" için gerekli değer tipleri olarak şemayı belirler.

Polimorfik türler

Çok biçimli bir türün ayırıcı alanını ve alt türlerini belirtmek için üst sınıftaki [JsonPolymorphic] ve [JsonDerivedType] özniteliklerini kullanın.

[JsonDerivedType], her alt sınıf için ayrımcı alanını şemaya ekler ve alt sınıf için belirli ayrımcı değeri belirten bir enum ekler. Bu öznitelik, ayrıştırıcı değerini ayarlamak için türetilmiş her sınıfın oluşturucusunu da değiştirir.

Özniteliği olan soyut bir [JsonPolymorphic] sınıfın şemada bir discriminator alanı vardır, ancak bir [JsonPolymorphic] özniteliği olan somut sınıfın şemada discriminator alanı yoktur. OpenAPI, ayrımcı özelliğinin şemada gerekli bir özellik olmasını gerektirir, ancak ayırıcı özelliği somut temel sınıfta tanımlanmadığından şema bir discriminator alan içeremez.

Şema dönüştürücü ile meta veri ekleme

Şema transformatörü, varsayılan meta verileri geçersiz kılmak veya oluşturulan şemaya değerler gibi example ek meta veriler eklemek için kullanılabilir. Daha fazla bilgi için bkz . Şema dönüştürücülerini kullanma.

Ek kaynaklar