3

我见过的大多数 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 似乎无论如何都创建了多个数据库表。

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

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

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

4

1 回答 1

6

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

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

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

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

于 2013-10-02T13:23:47.407 回答