如何正确映射 WebAPI 路由
Posted
技术标签:
【中文标题】如何正确映射 WebAPI 路由【英文标题】:How to map WebAPI routes correctly 【发布时间】:2016-07-16 11:00:31 【问题描述】:我正在使用 Web API 为类似 Twitter 的网站构建 API,但在映射路线时遇到了问题
我对用户控制器有以下操作:
public User Get(string firstname, string lastname)
public User Get(Guid id)
public User Friends(Guid id)
public User Followers(Guid id)
public User Favorites(Guid id)
所需的路线和生成的文档应该是:
api/users?firstname=firstname&lastname=lastname
api/users/id
api/users/id/friends
api/users/id/followers
api/users/id/favorites
在 WebApiConfig.cs 我有:
config.Routes.MapHttpRoute(
"2",
"api/controller/id",
new action = "get", id = RouteParameter.Optional
);
config.Routes.MapHttpRoute(
"1",
"api/controller/id/action"
);
?
【问题讨论】:
【参考方案1】:关于这个主题有很多有用的参考资料,例如:
Routing Basics with Web-API Web-API Routing for multiple methods Routing in Asp.net Mvc 4 and Web Api你看过这些吗?
更新..
明确说明哪个参数是哪个更好的做法,即:
config.Routes.MapHttpRoute(
name: "2",
routeTemplate: "api/controller/id",
defaults: new action = "Get", id = RouteParameter.Optional ,
);
config.Routes.MapHttpRoute(
name: "1",
routeTemplate: "api/controller/action/id",
defaults: null
);
我看到的主要错误是您在路线“1”中的操作/ID 顺序错误。
【讨论】:
看了所有这些【参考方案2】:考虑到你想要的灵活性,你应该看看
Attribute Routing in ASP.NET Web API 2
在 WebApiConfig.cs 中启用属性路由
// Web API routes
config.MapHttpAttributeRoutes();
在用户控制器中
注意给定动作名称Friends, Followers and Favorites
他们暗示返回集合而不是单个用户
[RoutePrefix("api/users")]
public class UserController: ApiController
//eg: GET api/users?firstname=firstname&lastname=lastname
[HttpGet]
[Route("")]
public User Get([FromUri]string firstname,[FromUri] string lastname) ...
//eg: GET api/users/id
[HttpGet]
[Route("id:guid")]
public User Get(Guid id)...
//eg: GET api/users/id/friends
[HttpGet]
[Route("id:guid/friends")]
public IEnumerable<User> Friends(Guid id)...
//eg: GET api/users/id/followers
[HttpGet]
[Route("id:guid/followers")]
public IEnumerable<User> Followers(Guid id)...
//eg: GET api/users/id/favorites
[HttpGet]
[Route("id:guid/favorites")]
public IEnumerable<User> Favorites(Guid id)...
【讨论】:
【参考方案3】:路由是顺序敏感的。 first 匹配总是获胜。因此,按照从最具体到最不具体的顺序排列路线非常重要。
// All parameters are required, or it won't match.
// So it will only match URLs 4 segments in length
// starting with /api.
config.Routes.MapHttpRoute(
"1",
"api/controller/id/action"
);
// Controller is required, id is optional.
// So it will match any URL starting with
// /api that is 2 or 3 segments in length.
config.Routes.MapHttpRoute(
"2",
"api/controller/id",
new action = "get", id = RouteParameter.Optional
);
当您的路线以这种方式排序时,您将获得您期望的行为。
【讨论】:
以上是关于如何正确映射 WebAPI 路由的主要内容,如果未能解决你的问题,请参考以下文章
Sitecore 7.5 的 MVC 检测和 WebApi 属性路由
ASP.NET WebApi 从入门到"放弃"系列---WebApi 请求路由