当前位置: 首页 > 知识库问答 >
问题:

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

邢博文
2023-03-14

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

场景1:简单的枚举参数

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

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

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

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

我的 API 方法有一个可选字段参数,它允许您指定应返回的任何其他数据。例如

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

这是枚举:

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

这里的最佳做法是什么?我正在研究按位枚举,所以在API请求中发送了一个值,这导致了字段的任意组合,但我不知道这是否适用于Web API,或者是否有更好的方法来实现这一点?


共有3个答案

宋航
2023-03-14

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

[Flags]
public enum OptionalField
{
    None = 0,
    RuleOwner = 1,
    Rule = 2,
    RuleAdministrator = 4,
    RuleEditor = 8,
    ...etc
}

这在这篇SO帖子中有所描述

正如Christian在他的回答中已经说过的那样,在REST API中使用它可能不是好的做法,但它应该可以工作。

贺宝
2023-03-14

最好的做法是使URI“可读”。所以我也能理解为什么使用Enum作为字符串。但正如赫里斯托·科列夫所说,你必须编写一个自定义模型活页夹。

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

public enum OptionalField
{
    None = 0,
    RuleOwner = 1,
    Rule = 2,
    RuleAndRuleOwner = 3,
    etc.
}
华飞驰
2023-03-14

最简单的答案是,“没关系”。

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

public IHttpActionResult Foo(RuleType ruleType)

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

如果客户端指定的值对枚举无效,则会引发异常(参数字典包含方法“Foo”的不可为null类型“ruleType”的参数“ruleType”为null条目…,并且客户端会得到400错误请求响应。

 类似资料:
  • 问题内容: 我们有一个REST API,客户端可以在其中提供代表Java Enums中服务器上定义的值的参数。 因此,我们可以提供一个描述性错误,我们将此方法添加到每个Enum中。似乎我们只是在复制代码(错误)。有更好的做法吗? 更新 :提供的默认错误消息为。我想提供一个来自API的更具描述性的错误。 问题答案: 可能可以实现通用静态方法。 像这样 那么你就可以 或显式调用实用程序类查找方法。

  • 问题内容: 我在这里看到了一些有关处理和持久保存枚举式值的最佳方法的问题/讨论(例如,持久化适用于枚举的数据,如何使用NHibernate来持久化枚举),我想问一下一般共识是什么。 特别是: 这些值应如何在代码中处理? 应该如何将它们持久保存到数据库中(作为文本/作为数字)? 不同解决方案的权衡是什么? 注意:我已将本问题中最初包含的解释移至答案。 问题答案: 我试图总结我的理解。 如果有任何更正

  • 问题内容: 我正在阅读有关sqlalchemy的信息,并且看到了以下代码: 我应该在库中使用常量将“类型”设置为int吗?还是我应该使枚举成为枚举? 问题答案: SQLAlchemy从0.6开始具有Enum类型:http ://docs.sqlalchemy.org/en/latest/core/type_basics.html?highlight=enum#sqlalchemy.types.En

  • 假设我有一个大约有10个字段的应用程序类。在其他一些实用程序类中,我有下面两种方法之一。在这两种方法中,哪一种最好?是传递整个应用程序对象更好,还是只传递实用方法所需的对象更好?请解释原因。

  • 我写了以下方法 我如何将不同的枚举类型传递给第二个参数?我知道我不能创建枚举的实例,但初始化枚举意味着我将传递一个值,而不是整个初始化的枚举,如下所示...其他枚举也将传递给相同的方法以实现组合细节

  • 问题内容: 我读了《有效Java》,其中指出最好使用来实现单例。 此方法在功能上等效于公共领域方法,除了它更简洁,免费提供序列化机制,甚至针对复杂的序列化或反射攻击,还提供了针对多重实例化的明确保证。尽管此方法尚未得到广泛采用,但是单元素枚举类型是实现单例的最佳方法。 尽管如此,这似乎是在动态序列化和真正的单实例上实现的折衷方案,但您却失去了经典单例的更友好的OOP方法。枚举不能被继承,只能实现一