3

我一直在研究 Web.Api 中的路由,并研究了表示端点的各种方式。我遇到了Instagram 的 REST 端点。(其中有一些可爱的文档)使用 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 调用定向到这些方法?

4

1 回答 1

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 - Web Api Designs

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

编辑:

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

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

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

ASP.NET Web API 中具有多个 GET 方法的单个控制器

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

config.Routes.MapHttpRoute(
     name: "MyApi",
     routeTemplate: "api/{controller}/{id}/{*wildcard}",
     defaults: new { controller = "index", id = RouteParameter.Optional }
 );
于 2012-10-24T00:24:34.547 回答