我是WEB API的新手,并尝试为多个GET操作设置路由。
控制器代码
// Get api/values
public IEnumerable<tblUser> Get()
{
//whatever
}
// Get api/values/action
[ActionName("GetByQue")]
public IEnumerable<tblQue> GetQue()
{
//whatever
}
// Get api/values/action
[ActionName("GetUserScore")]
public IEnumerable<tblScore> GetScore(string user)
{
//whatever
}
配置
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional}
);
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "GetByQue" }
);
config.Routes.MapHttpRoute(
name: "DefaultStringApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "GetUserScore" }
);
当我尝试使用 http://localhost:54118/api/remote/GetByQue 网址时出现此错误
{
"Message": "The request is invalid.",
"MessageDetail": "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'HydTechiesApi.Controllers.HydTechiesApiController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}
我的路由错了吗?任何帮助都是有价值的,因为我无法找到解决方案。
答案 0 :(得分:1)
您应该在第二个配置中将{action}
添加到routeTemplate
而不是{id}
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "GetByQue" }
);
你也可以尝试使用路线属于行动:
[ActionName("GetByQue")]
[Route("api/remote/GetByQue")]
public IEnumerable<tblQue> GetQue()
{
//whatever
}
或更改WebApiConfig.cs中配置的顺序(第二个配置和第一个配置)
答案 1 :(得分:0)
您在路线中犯了几个错误。如下面的示例代码:
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "GetByQue" });
//url: http://localhost:54118/api/remote/GetByQue
(1)。 routeTemplate:“api / {controller} / {id}”。您指定的路线有ID,而且不是可选的。所以你的URL必须有id。这就是您的错误所显示的内容。您可以处理以下问题:
defaults: new { id = RouteParameter.Optional }
(2)。 默认值:new {action =“GetByQue”}); 您没有在 routeTemplate 中说出有关操作的任何内容。 默认关于操作,不有任何意义。
(3)。从您的路径,您的网址应该看起来像 http://localhost:54118/api/remote/5 ,您的路线不应该获得多种方法。
(1)。改变路线如下:
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
请在每个方法中添加[HttpGet]。
[HttpGet]
public IEnumerable<tblUser> Get()
{......}
[HttpGet]
[ActionName("GetByQue")]
public IEnumerable<tblQue> GetQue()
{......}
[HttpGet]
[ActionName("GetUserScore")]
public IEnumerable<tblScore> GetScore(string user)
{......}
现在您可以使用 http://localhost:54118/api/remote/GetByQue
等网址非常有用的提示:使用[Route(“”)]标签指定参数 **您还必须像上面一样更改路线(1)
在Controller中,请指定请求方法以确保get方法
[HttpGet]
[ActionName("GetUserScore")]
[Route("api/remote/GetScore/{user}")]
public IEnumerable<tblScore> GetScore(string user)
{.....}
//URL: http://localhost:54118/api/remote/GetScore/user