【问题标题】:How do you programmatically access the Swagger.json file after it has been generated生成后如何以编程方式访问 Swagger.json 文件
【发布时间】:2017-08-18 01:50:55
【问题描述】:

我正在尝试创建一个使用 Swagger 在 .NetCore 中记录文档的动态 rest api(使用 Swashbuckle.AspNetCore)。 动态的意思是只有 1 个控制器开始时有 1 个可能的响应,但用户可以通过向服务发布 POST 添加“端点”,然后控制器可以转换新路由以相应地响应

为此,我需要能够访问和更改 swagger.json 文件以及更改 UI 以反映更改 - 这可能吗?如果有怎么办?

注意:我知道我可以通过导航到 /{documentname}/swagger.json 来访问和查看 swagger 文档,但这不允许我更改它

【问题讨论】:

  • 听起来 Swashbuckle Swagger 对您来说是错误的工具,您应该创建自己的 swagger 架构(硬),甚至可以使用由 editor.swagger.io/# 之类的程序创建的静态架构,或者从YAML。 Swashbuckle 使用您的控制器、路由和模型来生成定义

标签: c# asp.net-core swagger swashbuckle


【解决方案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));
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2014-08-10
  • 1970-01-01
  • 2014-05-19
  • 2018-09-01
  • 2015-08-15
  • 2010-12-24
相关资源
最近更新 更多