標籤:style http color io os ar 使用 sp 檔案
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方法屬性來實現。
ASP.NET Web API實踐系列03,路由模版, 路由慣例, 路由設定