IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Asp.Net Core中使用Swagger,你不得不踩的坑 -> 正文阅读

[开发测试]Asp.Net Core中使用Swagger,你不得不踩的坑

.NetCore3 Swagger 使用 SchemaFilter 给你 API Swagger 自定义请求参数显示

NeverSettle101 2020-01-22 16:17:31 ?2104 ?收藏
分类专栏: .NetCore3+ 自定义属性
版权

.NetCore3+
同时被 2 个专栏收录
8 篇文章0 订阅
订阅专栏

自定义属性
2 篇文章0 订阅
订阅专栏
原理
通过 Attribute来获取特别的参数,需要忽略或者增加的都可以,然后再实现 ISchemaFilter,通过反射获取到这些Attributes,最后根据获取到的属性来给 OpenApiSchema删除或者添加属性

IOperationFilter
来源于命名空间:namespace Swashbuckle.AspNetCore.SwaggerGen
官方应用源码

具体代码
属性定义
首先,定义一个需要添加参数的属性

[AttributeUsage(AttributeTargets.Property)]
? ? public class SwaggerExcludeAttribute : Attribute
? ? {
? ? }
1
2
3
4
然后,实现 ISchemaFilter,添加对应的处理

public class SwaggerExcludeFilter : ISchemaFilter
? ? {
? ? ? ? public void Apply(OpenApiSchema schema, SchemaFilterContext context)
? ? ? ? {
? ? ? ? ? ? if (schema?.Properties?.IsNullOrEmpty() ?? true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? return;
? ? ? ? ? ? }

? ? ? ? ? ? var excludedProperties = context.Type.GetProperties();
? ? ? ? ? ? foreach (var property in excludedProperties)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var attributes = property.GetCustomAttributes(true);
? ? ? ? ? ? ? ? var excludeAttributes = attributes.OfType<SwaggerExcludeAttribute>();
? ? ? ? ? ? ? ? if (!excludeAttributes.IsNullOrEmpty()
? ? ? ? ? ? ? ? ? ? && schema.Properties.ContainsKey(property.Name))
? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? schema.Properties.Remove(property.Name);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? };
? ? ? ? }
? ? }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
最后在 Startup 中注入 Swagger 中间件的位置引入

//other codes
services.AddSwaggerGen(options =>
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //options.OperationFilter<AddSwaggerBizParametersFilters>();
? ? ? ? ? ? ? ? options.SchemaFilter<SwaggerExcludeFilter>();
? ? ? ? ? ? ? ? // UseFullTypeNameInSchemaIds replacement for .NET Core
? ? ? ? ? ? ? ? //options.CustomSchemaIds(x => x.FullName);
? ? ? ? ? ? ? ? //options.DescribeAllEnumsAsStrings();
? ? ? ? ? ? });
//other codes
————————————————
版权声明:本文为CSDN博主「NeverSettle101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21265915/article/details/104070710

Asp.Net Core中使用Swagger,你不得不踩的坑

aiamt68242?2018-07-08 13:23:00??933??收藏?1

文章标签:?json?测试

版权

亚马逊又要放大招?7月15日亚马逊大咖在线直播带你一探究竟

全能型容器服务的技术架构是什么样?亚马逊容器专家在线深度剖析并演示,马上预约!

  很久不来写blog了,换了新工作后很累,很忙。每天常态化加班到21点,偶尔还会到凌晨,加班很累,但这段时间,也确实学到了不少知识,今天这篇文章和大家分享一下:Asp.Net Core中使用Swagger,你不得不踩的坑.

 这篇文章着重讲几点:

  • swagger 跨层注释问题
  • swagger Get请求传多个参数的问题
  • swagger Enum 注释问题
  • swagger api文档版本控制

第一步:搭建一个webapi项目或者mvc项目,引入swagger nuget

我创建项目,习惯性的先创建一个解决方案,取名为TB.AspNetCore.Swagger

接着会在解决方案上新建项目,取名TB.AspNetCore.Swagger.SApi,然后选择webapi,https最好去掉,加上后提示你要证书什么的,还会提示你网站不安全,我们做测试,没必要勾选

为了本项目问题的说明,我们会继续在常见三个类库项目TB.AspNetCore.Swagger.Data 放数据库实体,TB.AspNetCore.Swagger.Model 放模型-ViewModel,TB.AspNetCore.Swagger.Enum 放枚举类型

?

删除项目默认生成的class和controller,在api项目上引入swagger的nuget包,搜索:Swashbuckle.AspNetCore,这个包就在持续更新速度很快,已经到了3.0

第二部:引入版本控制nuget,添加关键性配置代码

这两个包是做版本控制管理的,如果不需要可以不添加,这里我做演示就添加上,额外再引入一个包Microsoft.Extensions.PlatformAbstractions,这个包是获取一些系统配置路径变量的包,这个包实在鸡肋,没有注释。。添加部分关键代码在configuration和configurationservice,代码如下:

 
  1. services.AddSwaggerGen(

  2. options =>

  3. {

  4. // resolve the IApiVersionDescriptionProvider service

  5. // note: that we have to build a temporary service provider here because one has not been created yet

  6. var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();

  7. // add a swagger document for each discovered API version

  8. // note: you might choose to skip or document deprecated API versions differently

  9. foreach (var description in provider.ApiVersionDescriptions)

  10. {

  11. options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description));

  12. }

  13. // add a custom operation filter which sets default values

  14. options.OperationFilter<SwaggerDefaultValues>();

  15. //

  16. // integrate xml comments

  17. options.IncludeXmlComments(XmlCommentsFilePath);

  18. options.IncludeXmlComments(XmlModelsFilePath);

  19. });

  20. public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)

  21. {

  22. if (env.IsDevelopment())

  23. {

  24. app.UseDeveloperExceptionPage();

  25. }

  26. app.UseMvc();

  27. //Swagger

  28. app.UseSwagger();

  29. app.UseSwaggerUI(

  30. options =>

  31. {

  32. foreach (var description in provider.ApiVersionDescriptions)

  33. {

  34. options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());

  35. }

  36. });

  37. }

第三部:新建控制器,测试我们的项目

我做了一个订单查询控制器,一个提交订单,一个查询订单,查询订单为get请求多参数,提交订单为post请求,其中的备注设计到枚举类型的如何加载

代码如下:

namespace TB.AspNetCore.Swagger.SApi.Controllers
{
    [Produces("application/json")]
    [ApiVersion("1.0", Deprecated = false)]
    [Route("api/v{api-version:apiVersion}/[controller]/[action]")]
    [ApiController]
    public class OrderController : ControllerBase
    {
        /// <summary>
        /// 查询订单
        /// </summary>
        /// <param name="orderCode">订单号</param>
        /// <param name="orderName">订单名称</param>
        /// <returns></returns>
        [HttpGet("{orderCode}/{orderName}")]
        public OrderModel QueryOrder(string orderCode, string orderName)
        {
            OrderModel model = new OrderModel
            {

                OrderCode = orderCode

            };
            return model;
        }

        /// <summary>
        /// 提交订单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public OrderModel SubOrder([FromBody]OrderModel model)
        {
            return model;
        }
    }

    public class OrderModel
    {
        /// <summary>
        /// 订单号
        /// </summary>
        public string OrderCode { get; set; }

        /// <summary>
        /// 订单金额
        /// </summary>
        public decimal OrderAmount { get; set; }

        /// <summary>
        /// 订单类型
        /// <Remark>
        /// 0 商家入驻
        /// 1 线下交易
        /// </Remark>
        /// </summary>
        public OrderTypeInfo OrderType { get; set; }

    }

    /// <summary>
    /// 
    /// </summary>
    public enum OrderTypeInfo
    {
        /// <summary>
        /// 商家入驻
        /// </summary>
        [Description("商家入驻")]
        StoreEntry = 0,
        /// <summary>
        /// 线下交易
        /// </summary>
        [Description("线下交易")]
        StoreTrade = 1,

    }
}

?效果图如下:**我把model和enum写到一个文件里,如果分别跨层写的话,也没有什么问题,只需要在startp里配置一下,由于时间关系,源码我上传到我都github,就不再细分了

?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 11:07:03  更:2021-07-23 11:08:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 21:20:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码