我在 .NET 6 中有一个小项目,其中包含类似的最少 API
app.MapGet("/clients",
async (IClientRepository repo) =>
{
var results = await repo.GetClientsAsync();
return mapper.Map<IEnumerable<ClientModel>>(results);
});
在
SwaggerUI
中,我可以使用此 API,但我找不到向其添加描述的方法(尽管在项目设置中我检查了创建 API XML 文档)。
如何添加 XML 注释?
目前对最小 API 的开放 API 文档的支持是相当少,并且据我所知不允许添加描述/摘要。 .NET 7 计划有一项功能来添加描述。很快
Swashbuckle
应该考虑EndpointMetadata
进行注释。
也相关问题。
更新
通过
Swashbuckle
nuget 包和 Swashbuckle.AspNetCore.Annotations
的最新更新,您可以向端点添加描述:
builder.Services.AddSwaggerGen(opts => opts.EnableAnnotations());
app.MapGet("/weatherforecast", () =>
{
// Implementation
})
.WithMetadata(new SwaggerOperationAttribute(summary: "Summary", description: "Descritption Test"));
// Or
app.MapGet("/weatherforecast1", [SwaggerOperation(summary: "Summary1", description: "Descritption Test1")] () =>
{
// Implementation
});
更新2
对于 .NET 7 和最新的
Swashbuckle.AspNetCore
包 WithDescription
也可以使用方法:
builder.Services.AddSwaggerGen();
...
app.MapGet("/weatherforecast", () =>
{
// implementation
})
.WithDescription("Some Method Description")
.WithOpenApi();
或与
EndpointDescriptionAttribute
:
app.MapGet("/weatherforecast1", [EndpointDescription("Some Attribute description")] () =>
{
// implementation
})
.WithOpenApi();
包装
Swashbuckle.AspNetCore.Annotations
6.3
...
builder.Services.AddSwaggerGen(c => c.EnableAnnotations());
var app = builder.build();
app.MapGet("/clients",
[SwaggerOperation(
Summary = "returns clients",
Description = "more description on get `clients`")]
[SwaggerResponse(200, "success")]
[SwaggerResponse(500, "some failure")]
async (IClientRepository repo) =>
{
var results = await repo.GetClientsAsync();
return mapper.Map<IEnumerable<ClientModel>>(results);
}).WithTags("Clients");
更多例子在这里 https://github.com/domaindrivendev/Swashbuckle.AspNetCore#enrich-operation-metadata
1。安装包
dotnet add package Swashbuckle.AspNetCore.Annotations
2。写代码
// Program.cs
builder.Services.AddSwaggerGen(x =>
{
x.EnableAnnotations();
});
// app.MapGet("/hi", [SwaggerOperation(Summary = "summary001", Description = "description001 `adads`")] () => "Hi");
app.MapGet("/hi", () => "Hi")
.WithMetadata(new SwaggerOperationAttribute("summary001", "description001"));
您可以使用扩展方法,我认为这是记录 API 端点的更简洁的方法。这样您就可以为每个端点定义通用响应方法。
为此,您需要安装以下软件包:
Swashbuckle.AspNetCore 和 Swashbuckle.AspNetCore.Annotations
using Microsoft.AspNetCore.Authorization;
using Swashbuckle.AspNetCore.Annotations;
public static class MinimalAttributeExtensions
{
public static RouteHandlerBuilder AllowAnonymous(this RouteHandlerBuilder endpoint)
{
endpoint.WithMetadata(new AllowAnonymousAttribute());
return endpoint;
}
public static RouteHandlerBuilder Authorize(this RouteHandlerBuilder endpoint, string policy = null, string[] roles = null, params string[] schemes)
{
var authorizeAttribute = new AuthorizeAttribute();
if (!string.IsNullOrEmpty(policy))
{
authorizeAttribute.Policy = policy;
}
if (roles != null && roles.Any())
{
authorizeAttribute.Roles = string.Join(',', roles);
}
if (schemes != null && schemes.Any())
{
authorizeAttribute.AuthenticationSchemes = string.Join(',', schemes);
}
endpoint.WithMetadata(authorizeAttribute);
return endpoint;
}
public static RouteHandlerBuilder AddMetaData<T>(this RouteHandlerBuilder endpoint, string tag, string summary = null, string description = null)
{
endpoint.WithTags(tag);
endpoint.WithMetadata(new SwaggerOperationAttribute(summary, description));
endpoint.WithMetadata(new SwaggerResponseAttribute(200, type: typeof(T)))
.WithMetadata(new SwaggerResponseAttribute(500, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(400, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(404, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(422, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(304, type: typeof(ErrorResponseModel)));
return endpoint;
}
public static RouteHandlerBuilder AddMetaData(this RouteHandlerBuilder endpoint, string tag, string summary = null, string description = null)
{
endpoint.WithTags(tag);
endpoint.WithMetadata(new SwaggerOperationAttribute(summary, description));
endpoint.WithMetadata(new SwaggerResponseAttribute(500, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(400, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(404, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(422, type: typeof(ErrorResponseModel)))
.WithMetadata(new SwaggerResponseAttribute(304, type: typeof(ErrorResponseModel)));
return endpoint;
}
}
以下是如何使用这些扩展方法的示例:
app.MapGet(“/books”, async (BooksDB db) =>
{
return await db.Books.ToListAsync()
})
.Authorize(policy : "AdminOnly", roles : new string[] {1,2}, schemes: "Bearer")
.AddMetaData<List<Book>>
(
tag : "Books",
summary : "Get All Books",
description : "Get All Books in List, Roles Allowed => Admin Only"
);
这里的
.AddMetaData<T>
代表成功的响应模型,这也会添加到该端点的响应文档中。在这种情况下,它是List<Book>
。
您可以使用本指南。它对我使用 Swashbuckle 有用。有些扩展方法带有最少的 API。这是它的样子:
app.MapGet(“/books”, async (BooksDB db) =>
await db.Books.ToListAsync()
)
.Produces<List<Book>>(StatusCodes.Status200OK)
.WithName(“GetAllBooks”).WithTags(“Getters”);