ASP.NET MVC Web.Api 路由 - 真实世界示例

Posted

技术标签:

【中文标题】ASP.NET MVC Web.Api 路由 - 真实世界示例【英文标题】:ASP.NET MVC Web.Api Routing - Real world example 【发布时间】:2012-10-23 23:19:24 【问题描述】:

我一直在研究 Web.Api 中的路由,并研究了表示端点的各种方式。我遇到了Instagrams REST endpoints。 (其中有一些可爱的文档)使用 Web.Api 为 Instagram 用户端点等情况设置路由和控制器的最佳方式是什么?

User Endpoints
GET/users/user-id                  Get basic information about a user.
GET/users/self/feed                See the authenticated user's feed.
GET/users/user-id/media/recent     Get the most recent media published by a user.
GET/users/self/media/liked         See the authenticated user's list of liked media.
GET/users/search                   Search for a user by name.

如果我想在我的应用程序中复制这些端点,我会怎么做。我是否只需要一个具有 5 种方法的控制器“用户”,我需要什么样的路由来将 REST 调用定向到这些方法?

【问题讨论】:

不清楚你在问什么。这是测验吗? @RobertHarvey 不是测验,请参阅已编辑的问题。 【参考方案1】:

我会以不同的方式来组织它。

GET/user
GET/user/user-id
GET/user?q=user-name

GET/media
GET/media/user-id
GET/media/user-id?selection=recent
GET/media/user-id?selection=liked

GET/feed
GET/feed/user-id

这样您就可以为特定目标保留控制器,就像为单一职责保留类一样。

用户 媒体 饲料

当您使用这种方法时,用户“猜测”路径会容易得多。而且我认为您已经可以猜到每条路径的作用,而无需任何解释。对我来说,这是我设计 API 时最重要的。

GET/controller            - always returns a item list
GET/controller/id         - always returns a specific item
GET/controller?q=         - always queries the controller
GET/controller?selection= - always selects a subset from the list off items

当然,这可以解释,但它让您了解我将如何解决这个特定问题,也许还有一些想法可以思考。也可以看看这本来自Apigee - Web Api Designs的好书

http://info.apigee.com/Portals/62317/docs/web%20api.pdf

编辑:

要制作您命名的路线,我认为您有 2 个(不是很理想)选项。

    为每个 url 映射一个特定的路由 制作通配符路由

选项 1 我自己没有尝试过或使用过,但您可以在此处找到更多信息:

Single controller with multiple GET methods in ASP.NET Web API

选项 2 如果您使用通配符路由,所有带有附加参数的请求都将被路由到您的默认 Get() 方法。在您的获取中,您必须使用 ControllerContext.Request.RequestUri.AbsolutePath 或类似的东西查看参数并选择您的操作。

config.Routes.MapHttpRoute(
     name: "MyApi",
     routeTemplate: "api/controller/id/*wildcard",
     defaults: new  controller = "index", id = RouteParameter.Optional 
 );

【讨论】:

+1 看起来是本好书,感谢您提供的链接。您对如何构建 api 的说明是有道理的,我想知道他们为什么不这样做?但是,我仍然对使用 Asp.Net Web.Api 获取这些路由所需的路由感兴趣。 那本书很棒。阅读起来非常好,简单,清晰和明确。 @AranMulholland 感谢您的反馈!请查看我的更新答案。 我想这会导致另一个问题,当您将特定路由映射到特定控制器操作时,约定(和映射)GetAction、PostAction、DeleteAction 等是否仍然适用? @AranMulholland 我想是的,因为您为 HttpMethod.Get 或 Put 等添加了 HttpMethodConstraint,但正如我所说,我自己并没有真正走这条路。

以上是关于ASP.NET MVC Web.Api 路由 - 真实世界示例的主要内容,如果未能解决你的问题,请参考以下文章

Web API系列教程2.1 — ASP.NET Web API中的路由机制

ASP.NET Web Api 路由自定义

ASP.NET MVC 4,Web API - 404 未找到

添加对 ASP.NET Web API 服务的服务引用

Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案 [转]

asp.net mvc+web api+easyui