Web API 路由 [一] Convention-Based Routing
Routing by Naming Convention
在App_Start/ WebApiConfig.cs文件中
routes.MapHttpRoute( name: "API Default", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
步骤:
1) 进行路由匹配,若匹配失败则返回404
2) 找到对应的Controller
3) 找到对应的Action。
原则1:根据HTTP的方法,找以该方法开头的函数。例如,HTTP的GET方法可以对应 GetUser(int id)或者GetAllUser()
原则2:在1基础上,如果其他可选的参数设置了(例如{id}),则选择相应满足的函数。
原则3:如果不存在对应的action,则调用失败
Routing by Explicitly Specification
- 使用HttpGet, HttpPut, HttpPost, HttpDelete 关键字,显式说明
- AcceptVerbs关键字一次声明多个HTTP方法
public class ProductsController : ApiController { [HttpGet] public Product FindProduct(id) {} [AcceptVerbs("GET", "HEAD")] public Product FindProduct(id) { } }
Routing by Action Name
1) 依据URI中的Action字段选择Action
routes.MapHttpRoute( name: "ActionApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
2) Action函数前,声明允许的HTTP方法
public class ProductsController : ApiController { [HttpGet] public string Details(int id); }
第二步中,也可以对一个Action进行重载,使用ActionName关键字
public class ProductsController : ApiController { [HttpGet] [ActionName("Thumbnail")] public HttpResponseMessage GetThumbnailImage(int id); [HttpPost] [ActionName("Thumbnail")] public void AddThumbnailImage(int id); //防止被调用声明 [NonAction] public string GetPrivateData() { ... } }