我正在尝试在RESTapi中建立分层链接。例如:
关注url会给我演员ID 1的详细信息:
/api/v1/actor/id/1/
以下网址预计会给我所有演员身份1的电影:
/api/v1/actor/1/movies
我的路线:
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultOneLevelNested",
routeTemplate: "api/v1/{controller}/{levelOneId}/{action}",
defaults: new { id = RouteParameter.Optional }
);
ActorController
中的行为:
[HttpGet]
public HttpResponseMessage Id(int id)
{
// logic
return Request.CreateResponse(HttpStatusCode.OK, actor);
}
[HttpGet]
public HttpResponseMessage Movies(int levelOneId)
{
// logic
return Request.CreateResponse(HttpStatusCode.OK, movies);
}
但是这个设置对我不起作用。
/api/v1/actor/id/1/
给了我适当的回应
但/api/v1/actor/1/movies
引发了以下错误:
No action was found on the controller 'Actor' that matches the name '1'."
我确实关注this thread,但它对我不起作用。
有人可以建议我在这里做错了什么吗?我正在使用MVC 4,WebAPI。
答案 0 :(得分:1)
尝试切换路线的顺序:
config.Routes.MapHttpRoute(
name: "DefaultOneLevelNested",
routeTemplate: "api/v1/{controller}/{levelOneId}/{action}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
订单在创建路线时很重要。你拥有它的方式,它首先匹配第一个(默认路由),而不是找到名称为" 1"的行动。
您可能还想查看MVC属性路由,我认为它更容易使用:http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx
答案 1 :(得分:1)
这项工作对我有用处:
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "LevelOneNested",
routeTemplate: "api/v1/{controller}/{id}/details/{action}",
defaults: new { id = RouteParameter.Optional }
);
基本上我已经为我的网址添加了1个路径级别。它终于成了:
/api/v1/actor/4/details/movies
答案 2 :(得分:0)
使用以下路线:
config.Routes.MapHttpRoute(
name: "DefaultOneLevelNested",
routeTemplate: "api/v1/{controller}/{id}/{action}",
constraints: new { controller = "actor", action ="movies" }
);
config.Routes.MapHttpRoute(
name: "DefaultCAApi",
routeTemplate: "api/v1/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
它们应与您的初始网址相匹配。