【问题标题】:Calling Web API with Singular or Plural Controller URIs使用单数或复数控制器 URI 调用 Web API
【发布时间】:2013-10-08 21:22:16
【问题描述】:

我见过的大多数 Web API 示例都以这种格式显示 URI:

/api/values/   (returns all records)
/api/value/{id}    (returns a specific record)

我可以想到我不喜欢这个 URI 约定的时候,但对于我当前的项目来说它是完美的。虽然,它对我不起作用,我不知道我可以做些什么来实现这一点。对我来说,我可以有一个或另一个 - 单数或复数。

如果我的控制器类名为 ValuesController,那么我的 Web API 是

/api/values/
/api/values/{id}

如果我的控制器类名为 ValueController,那么我的 Web API 是

/api/value/
/api/value/{id}

我使用 ADO.NET 实体数据模型在模型设计器中创建了多个实体。都有一个单一的命名约定。例如,Activity、State、Country、User 等。尽管如此,EF 似乎无论如何都创建了多个数据库表。

我为每个实体创建了 APIController。我已经用我的控制器尝试了 2 种命名约定 - 复数和单数,但我没有看到 URI 的预期(和期望)结果。无论我尝试什么,复数和单数 Web API 总是相同的。

仅供参考,我刚刚检查了自动创建的默认 API (ValuesController)。要返回所有记录,我必须指定 /api/values/ 并返回一条记录,我必须指定 /api/values/{id} - 两者都是复数,我确信默认情况下不是这样。

这有什么影响?为复数和单数配置/识别区分形式的 URI 的逻辑在哪里?

【问题讨论】:

  • “我确定默认情况下不是这样的。” - 是的。

标签: asp.net-mvc entity-framework asp.net-web-api


【解决方案1】:

Web API 的RouteConfig.cs 文件中配置的默认路由指定了一个名为controller 的参数,类似于:

routes.MapHttpRoute("Default", "api/{controller}/{id}",
    new { id = RouteParameter.Optional };

当您调用/api/values/api/values/{id} 时,您的控制器的路由值在这两种情况下都是values。因此,Web API 按照惯例解析的控制器将是ValuesController

(请注意,没有自动复数执行whatsoever。如果您真的想实现该行为,您可以实现自定义IHttpControllerSelector。我强烈不过,建议不要这样做。)

【讨论】:

  • 当时我不知何故误解了这一点。 “似乎”我读过/看过的关于创建 ASP Web API 的每个教程都显示了资源的单数和复数 URI。谢谢你让我明白这一点。
  • @rwkiii 复数实体名称背后的想法是resources,提及一些 RESTful 俚语。 {id} 参数将您要查询的资源(集合)缩小到具有特定 ID 的单个项目。您还可以配置其他路由,例如api/values/recentapi/values/popular。我想你明白了。
  • 如果您希望同时拥有“value”和“values”URI,您可以创建两个控制器,或者使用属性路由(仍在 RC 中)。
  • @rkwii ,那么你最终做了什么来解决这个问题?我有同样的问题..那么教程如何在一个控制器中获取复数和单数路由?
  • @Neville:哎呀,抓到了。这确实是一个错字,应该是 api/v2/orders/123456。我注意到这个问题是从 2013 年 10 月开始的,大约在 Web API 2.0 发布的时候,所以我不确定它是否与 Web API 1.0 或 2.0 有关。我不知道如何在 Web API 1.0 中混合单数和复数。但是,在 Web API 2.0 中,将 RouteAttributes 应用于控制器中的不同操作方法将允许在同一控制器中混合单数和复数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
相关资源
最近更新 更多