我正在做一个Restful服务,其中有一个项目列表,可以这样查询:
GET Api/Items
列出所有项目。 但当然我还需要将这些项目列为“最受欢迎”,或“属于用户x”或“属于Y类”
当浏览stackoverflow 2.0 api以了解他们如何解决这个问题时,他们将其URL命名如下:
GET Api/Items/MostPopular
我想采用的这种方法似乎有道理并且看起来很好。
但是,如何配置Web-API以允许此URL语法? 默认路由如下:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
所以我猜我需要在它前面添加额外的路由。 我可以这样做:(如果这甚至有效)
config.Routes.MapHttpRoute(
name: "SpecializedApi",
routeTemplate: "api/{controller}/MostPopular",
defaults: new { id = RouteParameter.Optional }
);
但是它会为我不喜欢的所有控制器添加MostPopular位。
这样的事情有用吗?
config.Routes.MapHttpRoute(
name: "SpecializedApi",
routeTemplate: "api/Items/MostPopular",
defaults: new { id = RouteParameter.Optional }
);
这是否真的是这样,因为我的路由表会很快变得非常大并且可能无法维护?
答案 0 :(得分:3)
最好的方法是添加其他获取操作并配置通用route
,而不是specific
路由。
首先为最流行的
添加动作// add action for Most Popular
[ActionName("MostPopular")]
public MyResult GetMostPopular()
{
return null;
}
设置处理行动的路线。
// Controller with ID
// To handle routes like `/api/Items/1`
config.Routes.MapHttpRoute(
name: "ControllerAndId",
routeTemplate: "api/{controller}/{id}",
defaults: null,
constraints: new { id = @"^\d+$" } // Only integers
);
// Controllers with Actions
// To handle routes like `/api/Items/MostPopular`
config.Routes.MapHttpRoute(
name: "ControllerAndAction",
routeTemplate: "api/{controller}/{action}"
);
答案 1 :(得分:1)
如果你没有偏离默认值,可能是最好的维护, 但是你应该在路线中指定控制器和动作,如下所示:
config.Routes.MapHttpRoute(
name: "SpecializedApi",
routeTemplate: "api/Items/MostPopular/{id}",
defaults: new { controller = "wheretogo",
action = "wichactiontotake",
id = RouteParameter.Optional
}
);
或者这也有效:
config.Routes.MapHttpRoute(
name: "SpecializedApi",
routeTemplate: "api/test/{action}/{id}.html",
defaults: new { controller = "test" }
);
使用虚假文件配置IIS时,请查看此链接: http://haacked.com/archive/2008/11/26/asp.net-mvc-on-iis-6-walkthrough.aspx