我正在尝试使用Swagger创建一个动态的rest api,用于.NetCore中的文档(使用Swashbuckle.AspNetCore)。 动态,即只有一个控制器,开始时有一个可能的响应,但用户可以添加"端点"通过POST到服务,然后控制器可以转换新的路由以做出相应的响应
为了做到这一点,我需要能够访问和更改swagger.json文件以及更改UI以反映更改 - 这可能吗?如果是这样的话?
注意:我知道我可以通过导航到/{documentname}/swagger.json来访问和查看swagger文档,但这不允许我更改它
答案 0 :(得分:1)
您可以使用自定义过滤器扩展,过滤和自定义架构: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#extend-generator-with-operation-schema--document-filters
我确实用它来为每个请求(比如授权头)装饰更多的头字段。我不确定,它是否适用于整个端点。但也许值得一试。
更新(已修改)
以下是添加整个端点的示例IDocumentFilter:
private class DocumentFilterAddFakes : IDocumentFilter
{
private PathItem FakePathItem(int i)
{
var x = new PathItem();
x.Get = new Operation()
{
Tags = new[] { "Fake" },
OperationId = "Fake_Get" + i.ToString(),
Consumes = null,
Produces = new[] { "application/json", "text/json", "application/xml", "text/xml" },
Parameters = new List<IParameter>()
{
new NonBodyParameter() // Can also be BodyParameter
{
Name = "id",
@In = "path",
Required = true,
Type = "integer",
Format = "int32",
@Default = 8
}
},
};
x.Get.Responses = new Dictionary<string, Response>();
x.Get.Responses.Add("200", new Response() { Description = "OK", Schema = new Schema() { Type = "string" } });
return x;
}
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
for (int i = 0; i < 10; i++)
swaggerDoc.paths.Add("/Fake/" + i + "/{id}", FakePathItem(i));
}
}