我有一个RESTful Web API项目,我有2个不同的Enum场景,我不确定是最佳实践.
场景1:直截了当的Enum Param
我的API方法需要一个名为的参数ruleType,其有效值为EmailAddress和IPAddress.我在Web API项目中的枚举如下所示:
public enum RuleType
{
None = 0,
EmailAddress = 1,
IPAddress = 2
}
Run Code Online (Sandbox Code Playgroud)
我对这个场景的问题是,我应该?ruleType=EmailAddress在我的API请求中使用它(它会自动将该值绑定到RuleTypeAPI方法中的属性)吗?如果是这样,如何最好地验证RuleTypeparam发送的是一个有效的RuleType Enum值?
场景2:单个参数的多个枚举值
我的API方法有一个可选的fieldsparam,它允许您指定应返回的任何其他数据.例如&fields=ruleOwner,rule.这将在响应中返回那2个额外的数据位.
我在Web API项目中有一个枚举,它与field可能请求的每个可能相关,目前,我正在拆分逗号分隔的字段param,然后循环遍历该枚举的每个字符串表示,将其解析为等效的枚举,结果在Enum值列表中,然后我可以在我的API中使用它来检索相关数据.
这是Enum:
public enum OptionalField
{
None = 0,
RuleOwner = 1,
Rule = 2,
etc.
}
Run Code Online (Sandbox Code Playgroud)
这里最好的做法是什么?我正在查看按位枚举,因此在API请求中发送了一个值,这导致了任何组合,fields但不知道这是否适用于Web API,或者通常是否有更好的方法来解决这个问题?
我在服务器上创建了一个枚举,其中手动设置了整数值,而不是从 0 开始默认增量
public enum UserType
{
Anonymous = 0,
Customer = 10,
Technician = 21,
Manager = 25,
Primary = 30
}
Run Code Online (Sandbox Code Playgroud)
我的服务器正在使用 AspNetCore.App 2.2.0 运行。它在 Startup.cs 中使用 swashbuckle aspnetcore 4.0.1 进行配置,以在每次服务器启动时生成一个 swagger json 文件来描述 api。
然后,我使用 NSwag Studio for windows v 13.2.3.0 生成带有该 swagger JSON 文件的 C Sharp api 客户端,以在 Xamarin 应用程序中使用。生成的 c Sharp api 客户端中生成的枚举如下所示 - 底层整数值与原始枚举不匹配。
[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")]
public enum UserType
{
[System.Runtime.Serialization.EnumMember(Value = @"Anonymous")]
Anonymous = 0,
[System.Runtime.Serialization.EnumMember(Value = @"Customer")]
Customer = 1, …Run Code Online (Sandbox Code Playgroud) 我目前正在使用Fluent Validation而不是使用Data Annotations我的Web API并使用swagger来获取API文档.流畅的验证规则没有反映在swagger模型中,因为我无法使用swagger模式过滤器配置流畅的验证规则.
本博客对ASP.net MVC使用它有很好的解释.但我无法配置它在ASP.net Core中使用它.
到目前为止,我已经尝试了以下代码,但我无法获得验证器类型.
services.AddSwaggerGen(options => options.SchemaFilter<AddFluentValidationRules>());
public class AddFluentValidationRules : ISchemaFilter
{
public void Apply(Schema model, SchemaFilterContext context)
{
model.Required = new List<string>();
var validator = GetValidator(type); // How?
var validatorDescriptor = validator.CreateDescriptor();
foreach (var key in model.Properties.Keys)
{
foreach (var propertyValidator in validatorDescriptor.GetValidatorsForMember(key))
{
// Add to model properties as in blog
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我使用https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-2.1&tabs=visual-studio#xml-comments来显示我的课程摘要说明在 SwaggerUI 中,可以但不显示enum摘要描述!
我的startup.cs
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "My App-Service",
Description = "My Description",
});
c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"));
c.DescribeAllEnumsAsStrings();
});
Run Code Online (Sandbox Code Playgroud)
我的enum:
public enum GenderEnum
{
/// <summary>
/// Man Description
/// </summary>
Man = 1,
/// <summary>
/// Woman Description
/// </summary>
Woman = 2
}
Run Code Online (Sandbox Code Playgroud)
我想像
这样在 SwaggerUI 中显示Man Description和显示:Woman Description
Man = 1, Man Description
Woman = 2, Woman Description …Run Code Online (Sandbox Code Playgroud) 我有一个.Net Core v2.1 Web API,它使用NSwag生成其Swagger Json。
我有一个这样的响应模型-
public class LoginResponse
{
public LoginResult LoginResult { get; set; }
}
public enum LoginResult
{
AwaitingEmailConfirmation = 0,
Locked = 1,
Failed = 2,
Success = 3
}
Run Code Online (Sandbox Code Playgroud)
生成Swagger JSON的-
"definitions":{
"LoginResponse":{
"type":"object",
"additionalProperties":false,
"required":[
"loginResult"
],
"properties":{
"loginResult":{
"$ref":"#/definitions/LoginResult"
}
}
},
"LoginResult":{
"type":"integer",
"description":"",
"x-enumNames":[
"AwaitingEmailConfirmation",
"Locked",
"Failed",
"Success"
],
"enum":[
0,
1,
2,
3
]
},
Run Code Online (Sandbox Code Playgroud)
当在JSON上运行swagger codegen时,我在IO.Swagger项目中为C#获得了以下LoginResult模型(选择了targetFramework 5.0)-
[JsonConverter(typeof(StringEnumConverter))]
public enum LoginResult
{
/// <summary>
/// Enum _0 …Run Code Online (Sandbox Code Playgroud) 我试图让枚举以大肆展示和响应时的描述(或任何其他属性)中的友好名称。还尝试解析控制器操作中主体/查询字符串上设置的友好名称,而不尝试 400 BadRequest 或任何类型的验证错误。我还注意到,我拥有的自定义通用 JsonConverter 也无法正常工作。该ReadJson()方法根本没有被调用。我怎样才能让它发挥作用?
[JsonConverter(typeof(JsonEnumConverter<SortDirectionType>))]
public enum SortDirectionType
{
[Description("asc")]
ASCENDING,
[Description("desc")]
DESCENDING
}
Run Code Online (Sandbox Code Playgroud)
我试图让 swagger-ui 将 asc 和 desc 显示为下拉列表中的值,而不是升序和降序。这意味着我无法使用c.DescribeAllEnumsAsStrings(). 如果我不使用它,那么下拉列表将显示 0,1,因为它应该代表枚举成员值。现在我可以使用[EnumMember(Value="asc"]属性而不是[Description("asc")]属性。然而接下来发生了两件事:
[FromBody]参数中成功使用 0,1 或 ASCENDING、DESCENDING 值。然而,这并不是我们所期望的。我将接收 asc、desc 并希望能够在主体模型上成功解析它并将其映射到枚举属性。另一方面,当 json 呈现时,它应该呈现友好的名称。附加代码:
public class JsonEnumConverter<T> : JsonConverter where T : struct, IComparable, IConvertible, IFormattable
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(T);
}
public override object ReadJson(JsonReader …Run Code Online (Sandbox Code Playgroud) c# ×6
asp.net-core ×3
enums ×3
swagger ×3
.net-core ×1
nswag ×1
nswagstudio ×1
performance ×1
rest ×1
swagger-ui ×1