在Web API中传递枚举参数的最佳实践

mar*_*nes 21 c# rest enums asp.net-web-api

我有一个RESTful Web API项目,我有2个不同的Enum场景,我不确定是最佳实践.

场景1:直截了当的Enum Param

我的API方法需要一个名为的参数ruleType,其有效值为EmailAddressIPAddress.我在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,或者通常是否有更好的方法来解决这个问题?

Mr.*_*. T 24

最简单的答案是"没关系".

如果controller方法中的参数是枚举类型

public IHttpActionResult Foo(RuleType ruleType)
Run Code Online (Sandbox Code Playgroud)

在WebAPI中,它只是工作 - 无论客户端请求URL是否将参数值指定为?ruleType=1?ruleType=EmailAddress

如果客户端指定对枚举无效的值,则抛出异常(The parameters dictionary contains a null entry for parameter 'ruleType' of non-nullable type 'RuleType' for method 'Foo' ...并且客户端获得400 Bad Request响应.

  • @FrederikGheysels 这是一个 Swagger 配置选项。请参阅/sf/ask/2551672791/ (3认同)
  • 我喜欢与ASP.NET Core相关的* It Just Works *答案^ _ ^ (2认同)

小智 10

使 URI“可读”是最佳实践。所以我也能理解你为什么使用 Enum 作为字符串。但正如 HristoKolev 所说,您必须编写自定义模型绑定器。

在字段中,我认为您不应该使用枚举的组合。因为很难理解。也许您可以创建枚举的组合作为枚举条目

public enum OptionalField
{
    None = 0,
    RuleOwner = 1,
    Rule = 2,
    RuleAndRuleOwner = 3,
    etc.
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*s W 6

对于场景 2,使用 [Flags] 属性在 C# 中内置支持枚举中的位掩码操作

[Flags]
public enum OptionalField
{
    None = 0,
    RuleOwner = 1,
    Rule = 2,
    RuleAdministrator = 4,
    RuleEditor = 8,
    ...etc
}
Run Code Online (Sandbox Code Playgroud)

这在这篇 SO 帖子中有描述

正如Christian在他的回答中已经指出的那样,在 REST API 中使用它可能不是一个好习惯,但它应该可以工作。

  • `[Flags]` 属性与位掩码操作无关。这只是编译器将掩码值的名称解析为`NameOne | 的语法提示。名称二`。不过,自然支持按位运算,因为您已经努力将枚举值设置为 2 的幂。 (3认同)