【问题标题】:Routes for MVC 4 Web APIs?MVC 4 Web API 的路由?
【发布时间】:2012-07-12 19:54:26
【问题描述】:

在我最初尝试创建 MVC4 Web API 时。我注意到关于路线处理方式的一些事情似乎有点不对劲:

  • 控制器不再有超过 4 个操作?
  • 仅支持一个 HTTP 动词的资源仍然拥有它自己的控制器吗?
  • 路由层次结构往往非常扁平,或者
  • 与人类的 MVC 应用程序相比,必须指定/维护极其大量的路由。

我已经创建了相当大的网站,只使用了两到三个路由,但我刚刚开始使用我的 API,而且我已经接近十几个了。我猜 API 从本质上来说更适合于比网站更深的 URL,但这似乎有点过分了。

我觉得我在某处缺少命名空间或路由约定。我几乎将所有这一切归因于动作名称不再是路由的一部分,而只是 HTTP 方法的事实。除了参数匹配、控制器名称和 HTTP 方法之外,还有其他方法支持路由吗?

【问题讨论】:

  • *4 个动作 + 假设 GET/PUT/POST/DELETE 的重载...

标签: asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api


【解决方案1】:

您可以在 Global.asax 中修改路由。默认设置为:

           routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }

但您可以更改它,例如使用操作名称:

routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }

有关 MVC WEB API 中自定义路由的更多信息,请查看article

基于 cmets 的更新

以上是问题的答案,“我可以更改路由吗?”简短的回答是肯定的,但正如在另一个答案中指出的那样,您可能不想维护一个好的 REST API。带有默认路由的 MVC Web API 维护您正在处理资源的基本 REST 概念,控制器代表资源。在您的另一个问题中,您举了一个例子:

DELETE /account/1234/note/321 <- delete note 321 on account 1234

您要删除帐户 1234 上的注释的位置。在这种情况下,您正在处理的资源是注释。更好的表示方法是使用查询字符串,因此本示例的 API 如下所示:

DELETE /note/321?account=1234 <- delete note 321 on account 1234

这样您就不需要弄乱路由,而且很明显,被处理的资源是一个带有过滤器的注释。但我也会质疑,如果 note 的 id 对于整个应用程序是唯一的,而不仅仅是特定帐户,是否有必要添加这个显式过滤器(即 where 子句)。

【讨论】:

  • 感谢这里的补充,这是我实际尝试编写的第一个 REST API,但仍处于“REST 就像 SOAP 除了 HTTP”阶段和对它感到满意之间的某个地方。在我的另一个问题中,'note' 的 id 是全球唯一的,所以我想我会删除帐户 #。我的印象仍然是,如果我有一个帐户和一个帐户注释,那么使用“/account/note/123”在语义上比仅使用“/note/123”来表示资源更好。在 MVC4 中似乎没有一个好的方法来创建这种嵌套而不创建一堆要维护的路由。
  • @Paul 使用任何适用于框架的 URL 结构。 /note/123 没有任何问题如果你真的想清楚它是一个帐户说明,那么可以使用/accountnote/123。网址只是标识符,不要因它们的结构而自责。
  • 我同意@DarrelMiller 的建议。 Apigee [apigee.com/about/resources] 的人员是设计 API 的绝佳资源。他们有一些很棒的关于开发 RESTful API 的免费视频和电子书。
【解决方案2】:

Web API 是为 RESTFull 服务设计和定制的,将控制器视为服务名称。按照约定,GET/PUT/POST/DELETE 映射到名称中包含动词的控制器操作。

如果你不想做 RESTFull 的事情,那么我会改用 HTTPController。您可能已经注意到,您可以在同一个项目中使用不同的路由将它们混合在一起。

【讨论】:

  • 我正在尝试创建一个,尽管这是我的第一个真正的 RESTful API。也许我的 URL 结构不正确:/customer/1234/premise/456/note/789。几天前我问了这个问题,虽然我并没有真正得到满意的答案:stackoverflow.com/questions/11266108/…
  • Web API 是为基于 HTTP 的 API 量身定制的。您可以使用 Web API 构建 RESTful 系统,也可以构建非 REST HTTP api。 Web API 中没有任何东西可以将您推向 REST 方向。
猜你喜欢
  • 1970-01-01
  • 2013-01-24
  • 2012-09-28
  • 2012-09-26
  • 2012-12-14
  • 1970-01-01
  • 2011-11-05
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多