控制器操作命名约定

本文关键字:命名约定 操作 控制器 | 更新日期: 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

此外,我建议你学习下面的文章以获得更深入的理解:

按操作名称路由

Restful服务不应在URI中包含CRUD函数名(https://restfulapi.net/resource-naming/)

这将更合适:

对于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,但它已经足够接近了,一个异常不会破坏任何东西。

我的观点是,使用任何有助于您的产品有意义的实现,并且不要太担心标准。