2015-11-04 147 views
3

根据命名约定,WebApi控制器操作名称应为Get(),Put()。 Post()等。但是告诉我,如果我有一个控制器作为CustomerController,现在我想在它内部有两个动作。一个是GetCustomerById(int id)另一个是GetCustomerByAge(int age)。这两个动作都接受一个参数为int。WebApi控制器操作命名约定

所以,如果我想使网址用户友好像“API /客户/”我也想跟着行动命名约定只喜欢获取(INT ID)/获取(INT年龄),如何我会做吗?

+0

您正在使用哪个Web Api版本?如果您使用的是Web Api 2,那么您可以使用Route属性。 –

回答

6

如果您希望Web API来当路由查找动作的名称,在App_Start文件夹改变WebApiConfig.cs类如下:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

然后,你可以做一个GET请求

http://mysite/api/customer/GetCustomerById/1 

此外,我建议你学习下面的文章进行更深层次的理解:

Routing by Action Name

+3

这个答案具有误导性,REST应该在HTTP方法中使用路径和动词中的名词,即GET/api/customers/1。更多细节:https://martinfowler.com/articles/richardsonMaturityModel.html –

2

另一种方法是HTTP方法属性。

通过使用HttpGet,HttpPut,HttpPost或HttpDelete属性修饰操作方法,您可以显式指定操作的HTTP方法,而不是使用HTTP方法的命名约定。

在下面的示例中,查找产品信息的方法被映射到GET请求:

public class ProductsController : ApiController 
{ 
    [HttpGet] 
    public Product FindProduct(id) {} 
} 

为了允许一个操作多个HTTP方法,或允许HTTP方法比GET其他,PUT,POST和DELETE,使用AcceptVerbs属性,该属性采用HTTP方法的列表。

public class ProductsController : ApiController 
{ 
    [AcceptVerbs("GET", "HEAD")] 
    public Product FindProduct(id) { } 
}