.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>();
});
相关推荐
杨哥带你写代码2 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_2 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端
背水2 小时前
初识Spring
java·后端·spring
晴天飛 雪2 小时前
Spring Boot MySQL 分库分表
spring boot·后端·mysql
weixin_537590453 小时前
《Spring boot从入门到实战》第七章习题答案
数据库·spring boot·后端
AskHarries3 小时前
Spring Cloud Gateway快速入门Demo
java·后端·spring cloud
Qi妙代码3 小时前
MyBatisPlus(Spring Boot版)的基本使用
java·spring boot·后端
宇宙超级勇猛无敌暴龙战神3 小时前
Springboot整合xxl-job
java·spring boot·后端·xxl-job·定时任务
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑3 小时前
SpringBoot(五)
java·spring boot·后端