Web Api实践系列(二)路由模板,路由惯例,路由设置
一、默认路由
ASP.NET Web API的路由和ASP.NET MVC相似,也是把路由放在RouteTable中的。可以在App_Start文件夹中的WebApiConfig.cs中设置路由模版。默认的路由模版是:
routes.MapHttpRoute( name: "API Default", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } );
● 静态片段api,主要用来区分ASP.NET MVC的路由。
● 为什么没有{action}?默认情况下,可以根据惯例找到Action,只要Action的名称符合惯例。
● 占位符变量{id}映射Action的参数。
二、什么是惯例路由那?
对于GET,POST,PUT,DELETE请求,如果Action的名称以Get, Post, Put, Delete开头,这就是符合惯例,意味着在请求的url中无需指明Action,就可以路由到对应的Action中。
假设有这样的一个api控制器:
public class BooksController : ApiController { public void GetAllBooks(){} public IEnumerable<Book> GetBookById(int id) public HttpResponseMessage DeleteProduct(int id){} public HttpResponseMessage PostProduct(int id){} public HttpResponseMessage PutProduct(int id){} }
● 浏览器输入:api/books 并且是Get请求
不带参数,由于GetAllBooks的名称以Get开头,符合惯例,这里会映射到GetAllBooks方法。
● 浏览器输入:api/books/8 并且是Get请求
带参数,会映射到GetBookById(int id)方法上。Web API会把字符串类型的8赋值给int类型的参数变量id。
● 浏览器输入:api/books/8 并且是DELETE请求
映射到DeleteProduct(int id)
● 浏览器输入:api/books 并且是POST请求
映射到PostProduct(int id)
三、根据HTTP方法路由
HttpGet, HttpPut, HttpPost, HttpDelete属性可以打在Action上面。
如果一个Action允许有多个HTTP方法,就使用AcceptVerbs属性。
public class BooksController : ApiController { [HttpGet] public Book FindBook(id){} [HttpPost] public Book AddBook(Book book){} ...... [AcceptVerbs("GET","HEAD")] public Books FindAll(Book book){} } 通过这种方法也可以找到相应的方法执行
四、使用action的路由
首先修改默认路由
routes.MapHttpRoute( name: "ActionApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
然后在控制器中写一下样式的代码,通过api/Books/Details/id=10 可以访问details方法,api/books/TestMethod/id=10 可以访问detials2 方法
//如果不想让Action参与到路由中,可以使用NoAction属性 [NonAction] public string GetSomeData
public class BooksController : ApiController { [HttpGet] public string Details(int id); [ActionName("TestMethod")] public string Details2(int id); }
总结:在WebApiConfig.cs中定义的路由模版都被放到了RouteTable中了。在Action层面,如果想让请求路由到Action上,可以通过惯例、Http方法属性来实现。