.NET 使用过滤器修改参数默认值

一、 背景

csharp 复制代码
[HttpPost]
public string Test(SearchReq search)
{
    return "ok" + search.Name;
}

从 swagger 中可以看出, 字符串若为空,则默认提交string,若要修改为指定字符,可修改过滤器

二、修改策略

2.1 创建过滤器

通过类型设置默认值

csharp 复制代码
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace WebApplication2.Conf
{
    public class Filter : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            if(schema == null)
            {
                return;
            }
            var obj = schema;
            foreach(var item in obj.Properties)
            {
                if (item.Value.Type == "string" && item.Value.Default == null)
                {
                    item.Value.Default = new OpenApiString("");
                }
            }
        }
    }
}

通过属性名设置默认值

ini 复制代码
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace WebApplication2.Conf
{
    public class Filter : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            if(schema == null)
            {
                return;
            }
            var obj = schema;
            foreach(var item in obj.Properties)
            {
                if (item.Value.Type == "string" && item.Value.Default == null)
                {
                    item.Value.Default = new OpenApiString("");
                }
                if (item.Key == "pageIndex")
                {
                    item.Value.Default = new OpenApiInteger(1);
                }
                else if(item.Key =="pageSize")
                {
                    item.Value.Default = new OpenApiInteger(10);
                }


            }
        }
    }
}

通过属性修改默认值

修改实体类

csharp 复制代码
using System.ComponentModel;

namespace WebApplication2.Model
{
    public class SearchReq
    {
        [DefaultValue("zhangsna")] 
        public String Name { get; set; }

        public string Description { get;set; }
        
        public int PageIndex { get; set; }
        
        public int PageSize { get; set; }
    }
}

修改过滤器

ini 复制代码
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.ComponentModel;
using System.Reflection;

namespace WebApplication2.Conf
{
    public class Filter : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            if(schema == null)
            {
                return;
            }
            var obj = schema;
            foreach(var item in obj.Properties)
            {
                if (item.Value.Type == "string" && item.Value.Default == null)
                {
                    item.Value.Default = new OpenApiString("");
                }
                if (item.Key == "pageIndex")
                {
                    item.Value.Default = new OpenApiInteger(1);
                }
                else if(item.Key =="pageSize")
                {
                    item.Value.Default = new OpenApiInteger(10);
                }
                // 通过特性来实现
                DefaultValueAttribute defaultValue = (context.ParameterInfo?.GetCustomAttribute<DefaultValueAttribute>());
                if(defaultValue != null)
                {
                    item.Value.Example = (IOpenApiAny)defaultValue.Value;
                }
            }
        }
    }
}

2.2 加载过滤器

ini 复制代码
builder.Services.AddSwaggerGen(option =>
{
    // 设置对象类型参数默认值
    option.SchemaFilter<Filter>();
});
相关推荐
uzong3 小时前
一次慢接口背后,竟藏着40+种可能!你中过几个
后端·面试·程序员
G探险者3 小时前
滴滴P0级故障背后:互联网公司是如何分级处理线上事故的?
后端
G探险者4 小时前
从 Tomcat 与 Jetty 的对比,聊聊影响一个服务并发能力的关键因素
后端
你的人类朋友4 小时前
“签名”这个概念是非对称加密独有的吗?
前端·后端·安全
幼稚园的山代王5 小时前
go语言了解
开发语言·后端·golang
kkjt01305 小时前
{MySQL查询性能优化索引失效的八大场景与深度解决方案}
后端
ss2735 小时前
手写MyBatis第107弹:@MapperScan原理与SqlSessionTemplate线程安全机制
java·开发语言·后端·mybatis
橙子家6 小时前
log4net 简介以及简单示例(.net8)
后端
间彧6 小时前
Spring Boot分布式WebSocket实现指南:项目实战与代码详解
后端
间彧6 小时前
Spring Boot集成WebSocket项目实战详解
后端