Отображение типов объектов для объекта[] в Swagger с использованием Swashbuckle

#.net-core #swagger #swashbuckle

Вопрос:

Это может быть нетривиальный вопрос, но, используя C# (.Net Core 3.1), я создаю профили swagger с помощью Swashbuckle.

Одна из моделей (внешний поставщик услуг) содержит поле формы object[] , которое может принимать два разных типа объектов:

 Object1 {
   Field1
   Field2
}

Object2 {
   Field1
   Field2
}
 

Можно ли как-то задокументировать это в чванстве? По умолчанию object[] в Swagger будет показано следующее:

 MyObject [
    null
]
 

В идеале я хотел бы показать примеры того null , чем на самом деле может быть этот объект.

Возможно ли это?

Пожалуйста, обратите внимание, что рассматриваемая модель предоставляется внешней службой, я просто пытаюсь выяснить, можно ли предоставить какую-либо значимую документацию в Swagger для клиентов, использующих приложение, в создании которого я участвую.

Ответ №1:

Swagger-лучший способ показать документацию, теперь, чтобы получить классы моделей возвращаемых типов, я бы предложил вам добавить атрибут «ProducesResponseType» поверх вашего метода. Вот как будет выглядеть Startup.cs.

 public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        services.AddControllers();
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo
            {
                Title = "Your Api name",
                Version = "v1",
                Description = "A simple example ASP.NET Core Web API",
                TermsOfService = new Uri("https://example.com/terms"),
                Contact = new OpenApiContact
                {
                    Name = "Custom Name",
                    Email = string.Empty,
                    Url = new Uri("https://linkedin.com/sampleurl"),
                },
                License = new OpenApiLicense
                {
                    Name = "Use under LICX",
                    Url = new Uri("https://example.com/license"),
                }
            });

            // Set the comments path for the Swagger JSON and UI.
            var xmlFile = $"{Assembly.GetEntryAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
            c.IncludeXmlComments(xmlPath);
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();

        }
        app.UseSwagger(c =>
        {
            c.SerializeAsV2 = true;
        });

        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "Your Api name");
        });

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
 

Теперь, когда вы настроили swagger в файле startup.cs, пришло время использовать их в своем контроллере.

 [Route("api/[controller]")]
[ApiController]
public class SampleController : ControllerBase
{
    /// <summary>
    /// Sample Summary
    /// </summary>
    /// <param name="param1">About Param 1</param>
    /// <param name="param2">About Param 2</param>
    /// <returns></returns>
    [HttpGet]
    [Route("{ipAddress}")]
    [ProducesResponseType(typeof(SampleResponse), StatusCodes.Status200OK)]
    [ProducesResponseType(typeof(string), StatusCodes.Status400BadRequest)]
    public async Task<IActionResult> GetSecurityDataAsync([FromRoute] string param1, [FromQuery] string param2)
    {
        try
        {
            //Custom logic
        }
        catch (Exception)
        {

            throw;
        }
    }
}
 

Примечание. Убедитесь, что путь XmlDocumentFilepath в разделе «Вывод» вкладки «Сборка» в свойствах проекта установлен.
Свойства проекта