控制器动作命名约定

时间:2015-11-04 04:14:38

标签: c# asp.net-web-api naming-conventions asp.net-web-api-routing

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

所以,如果我想让网址用户友好,比如“api / customer /”,我也想遵循动作命名惯例,只有 Get(int id)/ Get( int age),我该怎么做?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

另一种方法是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) { }
}

答案 2 :(得分:0)

在这种情况下,遵循信函的标准可能对您没有太大帮助。

一种解决方案是让自己偏离REST风格。

您可以有两个get方法:

一个可能是GetByID,另一个可能是GetByAge。

您的路线可能如下所示:

api / customer / getbyage / 20 api / customer / getbyid / 1134

这并非完全是REST,但它已经足够接近,并且一个异常不会破坏任何内容。

我的观点是使用任何有助于您的产品有意义的实现,而不必过多地担心标准。

答案 3 :(得分:0)

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

这更合适:

对于GetById- http://mysite/api/customers/123

对于GetByAge-http://mysite/api/customers?age=21