Импорт документа OpenAPI или JSON во время генерации Swagger - PullRequest
1 голос
/ 13 февраля 2020

У меня есть небольшая программа, которая принимает сборку и производит все соответствующие OpenApiDocument. Теперь мой вопрос: можно ли это импортировать в Swagger? Я знаю, что вы можете добавить фильтры для изменения документов после их создания, но мне интересно, можете ли вы дать Swagger документы и обойти автоматическое создание.

Внутри IDocumentFilter это позволяет вам измените OpenApiDocument, который создает Swagger, но я хотел бы использовать свой собственный 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)
 {
 }

Вот общедоступные методы, которые я хочу использовать при запуске API при настройке Swagger:

 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();
 }

1 Ответ

0 голосов
/ 13 февраля 2020

Я считаю, что методом проб и ошибок я нашел рабочее решение.

  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}");
          }
      });
  }
...