【问题标题】:Import OpenAPI Document or JSON during Swagger Generation在 Swagger 生成期间导入 OpenAPI 文档或 JSON
【发布时间】:2020-02-13 16:32:35
【问题描述】:

我有一个小程序,它接受一个程序集并生成所有相关的OpenApiDocument。现在,我的问题是,这可以导入 Swagger 吗?我知道您可以在创建文档后添加过滤器来修改文档,但我想知道您是否可以将文档提供给 Swagger 并规避自动生成。

IDocumentFilter 内部,它允许您修改 Swagger 创建的 OpenApiDocument,但我想使用我自己的 OpenApiDocument

  public interface IDocumentFilter
  {
      void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context);
  }

这里是我想配置 Swagger 以使用预定义的OpenApiDocument

 public void ConfigureServices(IServiceCollection services)
 {
     services.AddSwaggerGen(setupAction => TODO);
 }

 public void Configure(IApplicationBuilder app, IApiVersionDescriptionProvider provider)
 {
 }

以下是我想在配置 Swagger 时在 API 启动中使用的公开可用方法:

 public static IEnumerable<OpenApiDocument> CreateDocuments(this Assembly assembly, string title, string description, string name, string email)
 {
      return ControllerInfo.FindControllers(assembly)
          .GroupBy(controller => controller.Version)
          .OrderBy(group => group.Key)
          .Select(group => CreateDocument(group.Key, group, title, description, name, email));
 }

 public static string ToJson(this OpenApiDocument document)
 {
     using var outputString = new StringWriter();
     document.SerializeAsV3(new OpenApiJsonWriter(outputString));
     return outputString.ToString();
 }

【问题讨论】:

    标签: c# swagger openapi swashbuckle


    【解决方案1】:

    我相信通过反复试验,我找到了可行的解决方案。

      public void ConfigureSwagger(IApplicationBuilder app)
      {
          const string swagger = "Swagger";
    
          var directory = Path.Combine(Directory.GetCurrentDirectory(), swagger);
    
          Directory.CreateDirectory(directory);
    
          app.UseDefaultFiles().UseStaticFiles(new StaticFileOptions
          {
              FileProvider = new PhysicalFileProvider(directory),
              RequestPath = $"/{swagger}"
          });
    
          app.UseSwaggerUI(c =>
          {
              foreach (var document in Assembly.GetExecutingAssembly().CreateDocuments("title", "description", "name", "email"))
              {
                  var file = $"swagger{document.Info.Version}.json";
                  File.WriteAllText(Path.Combine(directory, file), document.ToJson());
                  c.SwaggerEndpoint($"/{swagger}/{file}", $"{document.Info.Title} {document.Info.Version}");
              }
          });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 2021-05-26
      • 2015-10-17
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多