控制器操作命名约定
本文关键字:命名约定 操作 控制器 | 更新日期: 2023-09-27 18:20:25
正如命名约定所说,WebApi控制器动作的名称应该是Get(),Put()。Post()等。但请告诉我,如果我有一个控制器为CustomerController,现在我想在其中有两个操作。一个是GetCustomerById(int id)和另一个是GetCustomer ByAge(int age)
因此,如果我想让url像"api/customer/"那样对用户友好,并且我想遵循操作命名约定,比如只Get(int id)/Get(int age),我将如何做到这一点?
如果您希望WebApi在路由时查找操作名称,请将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
此外,我建议你学习下面的文章以获得更深入的理解:
按操作名称路由
这将更合适:
对于GetById-http://mysite/api/customers/123
对于GetByAge-http://mysite/api/customers?age=21
另一种方法是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风格。
你可以有两种获取方法:
一个可以是GetByID,另一个可以为GetByAge。
你的路线可能是这样的:
api/customer/getbyage/20api/customer/getbyid/1134
这并不完全是REST,但它已经足够接近了,一个异常不会破坏任何东西。
我的观点是,使用任何有助于您的产品有意义的实现,并且不要太担心标准。