Генерация нескольких файлов swagger JSON для разных групп API

В моем решении настроен swagger, и он правильно отображает документацию по API. Недавно я разработал несколько новых API в том же решении, и они также отображаются в документации API, и эти проекты также следуют тем же соглашениям об именах. Теперь мое требование состоит в том, что я хочу отделить новую документацию API от более старых, поэтому в основном я хочу, чтобы два файла JSON генерировали по одному врагу каждый, старый API и новый API.

Моя конфигурация Swagger выглядит следующим образом.

  Config.EnableSwagger(@"api-docs/{apiVersion}",
            c =>
            {
                c.SingleApiVersion("v1", "SAMPLE API");
                c.UseFullTypeNameInSchemaIds();
                c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
                foreach (String x in Directory.GetFiles(Path.GetDirectoryName(Uri.UnescapeDataString(new UriBuilder(Assembly.GetExecutingAssembly().CodeBase).Path)), "*.dll")
                    .Where(f => Path.GetFileNameWithoutExtension(f).ToLower().Contains("sample") ****&& !Path.GetFileNameWithoutExtension(f).ToLower().Contains("sample.api"))****
                     
                    .Select(f => String.Format(@"{0}\{1}.xml", Path.GetDirectoryName(f), Path.GetFileNameWithoutExtension(f)))
                    .Where(File.Exists))
                {
                    c.IncludeXmlComments(x);
                }
                c.OperationFilter<AddRequiredHeaderParameter>();
            });

Мои новые проекты API называются sample.api.test, а старые проекты API называются sample.web.test. Я добавил часть && в предложение where, чтобы игнорировать выбор моих новых файлов в первом поколении документа JSON, но мне не повезло. Я новичок в этом и действительно не знаю, возможно ли иметь два JSON в зависимости от имен проектов. Любая помощь будет принята с благодарностью.


person user1595214    schedule 22.06.2020    source источник
comment
Вы заглядывали в MultipleApiVersions? Я думаю, это то, что вы должны использовать вместо SingleApiVersion, вот пример: github.com/heldersepu/Swagger-Net-Test/blob/MultiApiVersions/   -  person Helder Sepulveda    schedule 22.06.2020


Ответы (1)


Я исправил это с помощью IDocumentFilter следующим образом.

internal class SwaggerFilterOutControllers : IDocumentFilter
    {
        void IDocumentFilter.Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        {
            
            var apiKeys = swaggerDoc.paths.Select(s => s.Key).ToList();
            foreach (var apiKey in apiKeys)
            {
                if (swaggerDoc.info.title == "old API" && apiKey.StartsWith("/latapi"))
                    swaggerDoc.paths.Remove(apiKey);
                else if (swaggerDoc.info.title == "New Public API" && !apiKey.StartsWith("/latapi"))
                    swaggerDoc.paths.Remove(apiKey);
            }
}
}

а затем в методе enablewagger() я назвал этот фильтр как

c.DocumentFilter<SwaggerFilterOutControllers>();
person user1595214    schedule 24.06.2020