声明多个 Get 语句的 API 控制器
本文关键字:API 控制器 语句 Get 声明 | 更新日期: 2023-09-27 18:30:56
在MVC4中使用新的Api控制器,我发现了一个问题。 如果我有以下方法:
public IEnumberable<string> GetAll()
public IEnumberable<string> GetSpecific(int i)
这将起作用。 但是,如果我想检索一些不同类型的不同数据,它默认为 GetAll
方法,即使$.getJSON
设置为 GetAllIntegers
方法:
public IEnumberable<int> GetAllIntergers()
(错误的命名约定)
我能做到这一点吗?
Web API 控制器中只能有一个GetAll
方法吗?
我认为更容易想象我想要实现的目标。 这是一段代码,显示了我希望能够在单个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 }
);
对于默认路由模板,Web 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 谓词的路由与传统方法混合在一起,这里对此进行了很好的描述:
- Web API:混合传统和基于动词的路由
以防其他人遇到此问题。这是我解决这个问题的方法。使用控制器上的 [Route] 属性路由到特定 URL。
[Route("api/getClient")]
public ClientViewModel GetClient(int id)
[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()