控制器动作命名约定
正如命名约定所说,WebApi控制器动作名称应为Get(),Put()。 Post()等。但是告诉我,如果我有一个控制器作为CustomerController ,现在我想在其中有两个动作。 一个是GetCustomerById(int id) ,另一个是GetCustomerByAge(int age) 。 这两个动作都接受一个参数作为int。
所以,如果我想让url用户友好,比如“api / customer /”,我也想遵循命令约定,比如Get(int id)/ Get(int age) ,我该怎么做?
如果希望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
另外,我建议你学习下面的文章,以便更深入地理解:
按操作名称路由
另一种方法是HTTP方法属性。
您可以通过使用HttpGet,HttpPut,HttpPost或HttpDelete属性修改操作方法,而不是使用HTTP方法的命名约定,而是显式指定操作的HTTP方法。
在以下示例中,FindProduct方法映射到GET请求:
public class ProductsController : ApiController { [HttpGet] public Product FindProduct(id) {} }
要允许多个HTTP方法执行操作,或允许除GET,PUT,POST和DELETE之外的HTTP方法,请使用AcceptVerbs属性,该属性采用HTTP方法列表。
public class ProductsController : ApiController { [AcceptVerbs("GET", "HEAD")] public Product FindProduct(id) { } }
这是其中一种情况,即信件的以下标准可能实际上对您没有多大帮助。
一种解决方案是允许自己偏离REST风格。
你可以有两个get方法:
一个可能是GetByID,另一个可能是GetByAge。
您的路线可能如下所示:
api / customer / getbyage / 20 api / customer / getbyid / 1134
这不完全是REST,但它足够接近,一个例外不会破坏任何东西。
我的观点是使用任何实现来帮助您的产品有意义,不要过分担心标准。