.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>();
});
相关推荐
烛阴7 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
服务端技术栈7 小时前
电商营销系统中的幂等性设计:从抽奖积分发放谈起
后端
你的人类朋友7 小时前
✍️Node.js CMS框架概述:Directus与Strapi详解
javascript·后端·node.js
面朝大海,春不暖,花不开8 小时前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
钡铼技术ARM工业边缘计算机8 小时前
【成本降40%·性能翻倍】RK3588边缘控制器在安防联动系统的升级路径
后端
CryptoPP9 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
白宇横流学长9 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
草捏子10 小时前
状态机设计:比if-else优雅100倍的设计
后端
考虑考虑11 小时前
Springboot3.5.x结构化日志新属性
spring boot·后端·spring
涡能增压发动积11 小时前
一起来学 Langgraph [第三节]
后端