Как я могу добавить кнопку загрузки в пользовательский интерфейс Swagger в .NET Core Web API? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть основной веб-API ASP.net с swagger (используя swashbuckle).

Одним из действий в веб-API является действие загрузки файла:

[Produces("application/json")]
[Route("[controller]")]
public class FilesController : Controller
{
    [HttpPost]
    public void Post(IFormFile file)
    {
        ...
    }
}

Когда я просматриваю это действие в пользовательском интерфейсе swagger, оно позволяет мне заполнить все поля IFormFile, что я не хочу делать для проверки моего API.

Так, как я могу добавить кнопку загрузки в пользовательский интерфейс Swagger?

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

В дополнение к ответу @ Ника я должен внести 2 изменения в ядро ​​AspNet 2.

1] Обновлен GetOperationId ()

Теперь все идентификаторы операций содержат префикс API, а также метод в суффиксе. Поэтому я статически добавил API & Post в ActionName.

public static string GetOperationId<T>(string actionName) where T : ControllerBase => $"Api{GetControllerName<T>()}{actionName}Post";

2] Удалить только параметр файла

Вместо удаления всех параметров для этого действия я хочу удалить только параметр файла.

var fileParameter = operation.Parameters.FirstOrDefault(x => x.Name == "file" && x.In == "body");
if (fileParameter != null)
{
    operation.Parameters.Remove(fileParameter);
    ...
}
0 голосов
/ 04 мая 2018

Сначала добавьте фильтр операций, который использует составные данные формы.

public class FileUploadOperation : IOperationFilter
{
    private readonly IEnumerable<string> _actionsWithUpload = new []
    {
        //add your upload actions here!
        NamingHelpers.GetOperationId<FilesController>(nameof(FilesController.Post))
    };

    public void Apply(Operation operation, OperationFilterContext context)
    {
        if (_actionsWithUpload.Contains(operation.OperationId) )
        {
            operation.Parameters.Clear();
            operation.Parameters.Add(new NonBodyParameter
            {
                Name = "file",
                In = "formData",
                Description = "Upload File",
                Required = true,
                Type = "file"
            });
            operation.Consumes.Add("multipart/form-data");
        }
    }
}

    /// <summary>
    /// Refatoring friendly helper to get names of controllers and operation ids
    /// </summary>
    public class NamingHelpers
    {
        public static string GetOperationId<T>(string actionName) where T : Controller => $"{GetControllerName<T>()}{actionName}";

        public static string GetControllerName<T>() where T : Controller => typeof(T).Name.Replace(nameof(Controller), string.Empty);
    }

Теперь вы должны добавить свои действия в массив _actionWithUpload! Обратите внимание, что я добавил расширения только для того, чтобы иметь дружественный к рефакторингу фильтр.

И последнее, но не менее важное: убедитесь, что рабочий фильтр добавлен к опциям swagger. Так что добавьте options.OperationFilter<FileUploadOperation>(); к вашим опциям и готово.

Полный пример:

       services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc(Version, new Info
                {
                    Title = Title,
                    Version = Version                        
                }                
            );
            var filePath = Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, $"{_webApiAssemblyName}.xml");
            options.IncludeXmlComments(filePath);
            options.DescribeAllEnumsAsStrings();
//this is the step where we add the operation filter
            options.OperationFilter<FileUploadOperation>();
        });
...