我正在制作一个 Restful 服务,其中我有一个项目列表,可以这样查询:
GET Api/Items
其中列出了所有项目。 但当然,我还需要将这些项目列为“最受欢迎”、“属于用户 x”或“属于类别 Y”
当浏览 stackoverflow 2.0 api 以了解他们如何解决这个问题时,他们将 URLS 命名如下:
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 }
);
但随后它会为我不喜欢的所有 Controller 添加 MostPopular 位。
这样的东西有用吗?
config.Routes.MapHttpRoute(
name: "SpecializedApi",
routeTemplate: "api/Items/MostPopular",
defaults: new { id = RouteParameter.Optional }
);
这真的是我的路由表会很快变得非常大并且可能无法维护的方法吗?
请您参考如下方法:
最好的办法是添加另一个获取操作并配置通用路由而不是特定路由。
首先为最受欢迎的添加 Action
// add action for Most Popular
[ActionName("MostPopular")]
public MyResult GetMostPopular()
{
return null;
}
设置路由来处理 Action 。
// 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}"
);
