使用在MVC4新的API控制,我发现一个问题。 如果我有以下几种方法:
public IEnumberable<string> GetAll()
public IEnumberable<string> GetSpecific(int i)
这将工作。 但是,如果我想要检索不同类型的一些不同的数据,则默认为GetAll
方法,即使$.getJSON
设置为GetAllIntegers
方法:
public IEnumberable<int> GetAllIntergers()
(坏的命名约定)
是否有可能对我来说,能做到这一点?
我只能有一个GetAll
在Web API控制器的方法?
我认为这是比较容易想象我想要实现的。 下面是一个代码片段,显示想我是能够做到的,在一个单一的ApiController
:
public IEnumerable<string> GetClients()
{ // Get data
}
public IEnumerable<string> GetClient(int id)
{ // Get data
}
public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}
public IEnumerable<string> GetStaffMembers()
{ // Get data
}
这是所有的路由。 默认的Web API的路线是这样的:
config.Routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
使用默认路由模板,网页API使用HTTP方法来选择操作。 在结果它将映射不带参数的第一个GET请求GetAll
它可以找到。 要解决这一点,你需要定义包括动作的名称的路线:
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
之后,你可以让明星用下列URL的请求:
- API / yourapicontroller / GetClients
- API / yourapicontroller / GetStaffMembers
这样你可以有多个GetAll
的控制器。
这里的一个更重要的是,这种风格的路由,则必须使用属性来指定允许的HTTP方法(如[HTTPGET])。
也有与传统方法默认的Web API基于动词路由的混合选项,这是很好的描述如下:
万一别人面临着这个问题。 以下是我解决了这个。 使用控制器上的[路径]属性路由到特定的URL。
[Route("api/getClient")]
public ClientViewModel GetClient(int id)
[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()