.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>();
});
相关推荐
摇滚侠4 分钟前
Spring Boot3零基础教程,事件驱动开发,设计登录成功后增加积分记录信息功能,笔记61
java·spring boot·笔记·后端
三十_9 分钟前
TypeORM 多对多关联篇:中间表、JoinTable 与复杂关系的建模
前端·后端
AlpsMonaco13 分钟前
使用iptables进行网络地址的重定向
后端
Penge66634 分钟前
Git LFS 上传大文件避坑指南:从忽略报错到成功推送的完整流程
后端
SimonKing1 小时前
【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(四)!
java·后端·程序员
笃行3501 小时前
KingbaseES电科金仓数据库SQL调优
后端
这周也會开心1 小时前
SpringBoot的搭建方式
java·spring boot·后端
varin1 小时前
分析OpenManus源码,建立拥有完全自主规划的AI智能体
后端
Tech有道1 小时前
字节跳动面试:Redis 数据结构有哪些?分别怎么实现的?
后端·面试
9ilk1 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 介绍
linux·笔记·分布式·后端·rabbitmq