在Web API中传递枚举参数的最佳做法

时间:2016-09-30 10:51:42

标签: c# rest asp.net-web-api enums

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

场景1:简单的Enum Param

我的API方法需要一个名为ruleType的参数,其有效值为EmailAddressIPAddress。 我在Web API项目中的枚举如下所示:

public enum RuleType
{
    None = 0,
    EmailAddress = 1,
    IPAddress = 2
}

我对这个场景的问题是,我应该在API的请求中使用?ruleType=EmailAddress(它会自动将该值绑定到API方法中的RuleType属性)吗?如果是这样,如何最好地验证发送的RuleType参数是否是有效的RuleType枚举值?

场景2:单个参数的多个枚举值

我的API方法有一个可选的fields参数,它允许您指定应返回的任何其他数据。例如。 &fields=ruleOwner,rule。这将在响应中返回那2个额外的数据位。

我在Web API项目中有一个枚举,它与可能请求的每个可能field相关,目前,我正在拆分逗号分隔的字段param,然后循环遍历该枚举的每个字符串表示,将其解析为等效的枚举,生成一个Enum值列表,然后我可以在我的API中使用它来检索相关数据。

这是Enum:

public enum OptionalField
{
    None = 0,
    RuleOwner = 1,
    Rule = 2,
    etc.
}

这里最好的做法是什么?我正在研究按位枚举,因此在API请求中发送了一个值,导致fields的任意组合,但不知道这是否适用于Web API,或者是否有&#39一般来说,这是一个更好的方法吗?

4 个答案:

答案 0 :(得分:13)

最简单的答案是,"它并不重要"。

如果控制器方法中的参数是枚举类型

public IHttpActionResult Foo(RuleType ruleType)

在WebAPI中, It Just Works - 无论客户请求URL是否将parmeter值指定为?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响应。

答案 1 :(得分:4)

最佳做法是使URI“人类可读”。所以我也可以理解为什么你使用Enum作为字符串。但正如HristoKolev所说,你必须写一个自定义的Model Binder。

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

group :development do
  gem 'sqlite3'
  gem 'web-console'
  gem 'listen', '~> 3.0.5'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

答案 2 :(得分:4)

对于方案2,使用[Flags]属性

在C#中为Enums中的位掩码操作提供内置支持
[Flags]
public enum OptionalField
{
    None = 0,
    RuleOwner = 1,
    Rule = 2,
    RuleAdministrator = 4,
    RuleEditor = 8,
    ...etc
}

this SO post

中描述了这一点

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

答案 3 :(得分:0)

是否有多个值,如果您使用Enum作为字符串,则必须手动解析它。在.NET中,Enums是整数,因此如果要将枚举发送到默认模型绑定器,则必须执行以下操作:?ruleType=1

你可以编写自己的模型绑定器来接受字符串,但是你必须问问自己为什么要这样做?如果您希望用户能够轻松识别网址,请使用字符串。如果没有,没有理由不使用整数。如您所说,您可以使用FlagsAttribute组合多个值。