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

Asp.net mvc ASP.NET MVC Web.Api路由-真实世界示例,asp.net-mvc,asp.net-web-api,asp.net-mvc-routing,asp.net-web-api-routing,Asp.net Mvc,Asp.net Web Api,Asp.net Mvc Routing,Asp.net Web Api Routing,我一直在研究Web.Api中的路由,以及各种表示端点的方法。我偶然发现。(其中有一些可爱的文档)使用Web.Api为Instagrams用户端点这样的情况设置路由和控制器的最佳方法是什么 User Endpoints GET/users/user-id Get basic information about a user. GET/users/self/feed See the authenticated user's feed.

我一直在研究Web.Api中的路由,以及各种表示端点的方法。我偶然发现。(其中有一些可爱的文档)使用Web.Api为Instagrams用户端点这样的情况设置路由和控制器的最佳方法是什么

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个方法,我需要什么样的路由才能将其余的调用定向到这些方法?

我会用不同的方式来构造它

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-webapi设计的好书

编辑:

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

  • 为每个url映射特定的路由
  • 做一条通配符路线
  • 选项1 我没有尝试过,也没有亲自使用过,但您可以在此处找到更多信息:

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

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

    不清楚你在问什么。这是一个测验吗?@RobertHarvey不是一个测验,请参阅编辑后的问题。+1看起来像一本好书,谢谢你的链接。你对如何构造api的澄清是有意义的,我想知道他们为什么没有这样做?然而,我仍然对使用Asp.NETWeb.Api获取这些路由所需的路由感兴趣。这本书非常好。阅读起来非常简单,非常清晰。@AranMulholland感谢您的反馈!请看我的最新答案。我想这会引出另一个问题,当你将一个特定的路由映射到一个特定的控制器操作时,约定(和映射)GetAction、PostAction、DeleteAction等是否仍然适用?@AranMulholland我想是的,由于您为
    HttpMethod.Get
    或Put等添加了
    HttpMethodConstraint
    ,但正如我所说,我本人从未真正走过这条路线。