如何在C# .NET的HTTP POST请求中避免提交空字符串
解决方案
问题原因
你遇到的是Swashbuckle(ASP.NET Core配套的Swagger生成工具)的默认行为:它会给可空字符串类型的属性自动生成"string"作为示例值,而类属性的默认值(比如= string.Empty)不会被Swagger自动识别并应用到示例中。
方法一:通过特性单独指定示例值
先安装Swashbuckle.AspNetCore.Annotations NuGet包,然后在Dto的每个字符串属性上添加[SwaggerSchema]特性,指定空字符串作为示例:
using Swashbuckle.AspNetCore.Annotations; public class AddQuoteDto { [Required(ErrorMessage = "Quote is required")] [SwaggerSchema(Example = "")] public string? Quote { get; set; } [Required(ErrorMessage = "Author is required")] [SwaggerSchema(Example = "")] public string? Author { get; set; } [Required(ErrorMessage = "Tags are required")] [SwaggerSchema(Example = "")] public string? Tags { get; set; } }
方法二:全局配置Swagger示例规则
如果不想给每个属性单独加特性,可以在Program.cs中全局配置Swagger的Schema生成规则,让所有可空字符串的默认示例为空:
using Microsoft.OpenApi.Models; builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); // 配置字符串类型的默认示例为空 c.SchemaGeneratorOptions.ConfigureSchemaForType<string>(schema => { schema.Example = new OpenApiString(""); }); // 针对可空字符串单独配置(按需选择) c.SchemaGeneratorOptions.ConfigureSchemaForType<string?>(schema => { schema.Example = new OpenApiString(""); }); });
方法三:启用Swagger读取类属性默认值
从Swashbuckle.AspNetCore 6.0+版本开始,可以配置让Swagger读取类属性的默认值作为示例,这样你之前设置的= string.Empty就会生效:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" }); // 启用读取属性默认值作为示例 c.SchemaGeneratorOptions.ApplyDefaultValues = true; });
内容的提问来源于stack exchange,提问作者ShaunakMufc
相关产品推荐
相关产品推荐

