正如命名约定所说,WebApi控制器动作名称应为Get(),Put()。 Post()等。但是告诉我,如果我有一个控制器作为 CustomerController ,现在我想在其中有两个动作。一个是 GetCustomerById(int id),另一个是 GetCustomerByAge(int age)。这两个动作都接受一个参数为int。
所以,如果我想让网址用户友好,比如“api / customer /”,我也想遵循动作命名惯例,只有 Get(int id)/ Get( int age),我该怎么做?
答案 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
另外,我建议您学习以下文章以加深理解:
答案 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