Как программно получить доступ к файлу Swagger.json после его создания

Я пытаюсь создать API динамического отдыха, который использует Swagger для документации в .NetCore (используя Swashbuckle.AspNetCore). Динамический в том смысле, что для начала существует только 1 контроллер с 1 возможным ответом, но пользователь может добавить «конечные точки» с помощью отправки POST в службу, что затем контроллер может преобразовать новые маршруты для соответствующего ответа.

Для этого мне нужно получить доступ к файлу swagger.json и изменить его, а также изменить пользовательский интерфейс, чтобы отразить изменения — возможно ли это? если да то как?

Примечание. Я знаю, что могу получить доступ и просмотреть документ swagger, перейдя к /{documentname}/swagger.json, но это не позволяет мне изменить его.


person Achilles    schedule 18.08.2017    source источник
comment
Похоже, что Swashbuckle Swagger — неподходящий инструмент для вас, и вам следует создать собственную схему swagger (жесткую), возможно, даже использовать статическую, созданную такими программами, как editor.swagger.io/# или создайте swagger.json из YAML. Swashbuckle использует ваши контроллеры, маршруты и модели для генерации определения   -  person Tseng    schedule 18.08.2017


Ответы (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));
    }
}
person Benjamin Schäublin    schedule 18.08.2017
comment
Вот вывод DocumentFilterAddFakes: swashbuckletest.azurewebsites.net/ swagger/ui/index?filter=Fake#/ - person Helder Sepulveda; 18.08.2017
comment
спасибо отлично работает!! Отредактировал код для некоторых вещей синтаксиса - person Achilles; 18.08.2017