控制器动作命名约定

正如命名约定所说,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,但它足够接近,一个例外不会破坏任何东西。

我的观点是使用任何实现来帮助您的产品有意义,不要过分担心标准。