.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>();
});
相关推荐
SelectDB9 小时前
某头部保险公司基于 SelectDB 的统一 OLAP 架构实践
后端
ServBay10 小时前
ServBay 1.33.0 来了:AI Gateway 一键接管主流 AI CLI 与多模型
后端·aigc·ai编程
行者全栈架构师10 小时前
Spring Boot 接入 MaxKey 单点登录:6 个内部系统,一次登录全通行
java·vue.js·后端
JuiceFS10 小时前
卓驭:百 PB 级智驾数据存储架构演进
后端·自动驾驶
鱼弦10 小时前
跨模态迁移的极限:语言模型的逻辑能力能否完全迁移到视觉?
后端
ModStart10 小时前
写歌、翻唱、可编辑乐谱,YuE2-3B 在 AIGCPanel 一键跑通
后端
故作春风10 小时前
elpis-core 核心从入门到理解
后端·架构·node.js
LEE10 小时前
前端转型全栈 01:数据建模,前端最大的盲区
前端·javascript·后端
Sam_Deep_Thinking10 小时前
单一职责原则:JAVA LocalDate的设计取舍
java·后端·程序员·单一职责原则
GoGeekBaird10 小时前
(万字长文拆解云沙箱)让 Agent 从执行代码升级到拥有一个临时Runtime
后端·agent