使用最小 WEB API 实现文件上传的Swagger支持

网友投稿 254 2022-06-07


目录前言:一、允许ContentType二、自定义OperationFilter

前言:

上回,我们使用最小 WEB API 实现文件上传功能《​ ​使用最小 WEB API 实现文件上传会遇到的坑​​》,虽然客户端访问是正常的,但是当打开 Swagger 页面时,发现是这样的:

没法使用 Swagger 页面测试。

一、允许 Content Type

正常的 Swagger 页面应该是这样的:

看来,我们需要指定 Content Type:

app.MapPost("/upload",     async (HttpRequest request) =>     {         var form = await request.ReadFormAsync();         return Results.Ok(form.Files.First().FileName);     }).Accepts("multipart/form-data");

结果,Swagger 页面变成了这样,增加了一堆 Form 相关属性,唯独没有 ​​file​​ :

看来,只有自定义 Swagger 页面了。

二、自定义 OperationFilter

在 OpenAPI 3.0 中,文件上传的请求可以用下列结构描述(https://swagger.io/docs/specification/describing-request-body/file-upload/):

而在 Swashbuckle 中,可以使用 IOperationFilter 接口实现操作筛选器,控制如何定义 Swagger UI 的行为。

在这里,我们将利用 ​​RequestBody​​ 对象来实现上述的文件上传的请求结构。

public class FileUploadOperationFilter : IOperationFilter {     public void Apply(OpenApiOperation operation, OperationFilterContext context)     {         const string FileUploadContentType = "multipart/form-data";         if (operation.RequestBody == null ||             !operation.RequestBody.Content.Any(x =>             x.Key.Equals(FileUploadContentType, StringComparison.InvariantCultureIgnoreCase)))         {             return;         }                   if (context.ApiDescription.ParameterDescriptions[0].Type == typeof(HttpRequest))         {             operation.RequestBody = new OpenApiRequestBody             {                 Description = "My IO",                 Content = new Dictionary                 {                     {                         FileUploadContentType, new OpenApiMediaType                         {                             Schema = new OpenApiSchema                             {                                 Type = "object",                                 Required = new HashSet{ "file" },                                 Properties = new Dictionary                                 {                                     {                                         "file", new OpenApiSchema()                                         {                                             Type = "string",                                             Format = "binary"                                         }                                     }                                 }                             }                         }                     }                 }             };         }     } }

然后,在启动代码中配置,应用此操作筛选器:

builder.Services.AddSwaggerGen(setup => {     setup.OperationFilter(); });

这将呈现如下 Swagger 页面:

到此这篇关于使用最小 WEB API 实现文件上传的Swagger支持的文章就介绍到这了,更多相关使用最小 WEB API 实现文件上传 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python采用Django制作简易的知乎日报API
下一篇:基于Windows API实现遍历所有文件并删除的方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~