ASP.NET Web API實踐系列03,路由模版, 路由慣例, 路由設定

Darren Ji發表於2014-10-25

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){}
}

● 瀏覽器輸入: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請求
沒有對應POST請求的Action。返回404狀態碼。

 

□ 根據HTTP方法路由

 

HttpGet, HttpPut, HttpPost, HttpDelete屬性可以打在Action上面。

 

public class BooksController : ApiController
{
    [HttpGet]
    public Book FindBook(id){}
}

 

如果一個Action允許有多個HTTP方法,就使用AcceptVerbs屬性。

public class BooksController ; ApiController
{
    [AcceptVerbs("GET","HEAD")]
    public Book FindProduct(id){}
}

 

□ 考慮Action的路由

 

我們可以在WebApiConfig.cs中設定路由的模版,把Action考慮進去。

routes.MapHttpRoute(
    name: "ActionApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

 

在api控制器中:

public class BooksController : ApiController
{
    [HttpGet]
    public string Details(int id);
}

此時,在瀏覽器中輸入類似"api/books/details/8"的格式,才能對映到Details(int id)方法上。

 

還可以通過ActionName屬性給Action取別名:

public class BooksController : ApiController
{
    [ActionName("Sth")]
    public HttpResposneMessage GetSth(int id);
}

 

如果不想讓Action參與到路由中,可以使用NoAction屬性。

public class BooksController : ApiController
{
    [NonAction]
    public string GetSomeData(){}
}

 

 

總結:在WebApiConfig.cs中定義的路由模版都被放到了RouteTable中了。在Action層面,如果想讓請求路由到Action上,可以通過慣例、Http方法屬性來實現。

 

相關文章