Web API-路由(一)
這一篇文章描述了ASP.NET API如何將HTTP請求路由到控制器。
如果你熟悉ASP.NET MVC,Web API路由和MVC路由非常相似,主要的不同地方是Web API使用HTTP方法,而不是URI路徑去選擇action。你也能夠在WebAPI中使用MVC風格的路由,這一篇文章不討論任何有關MVC的知識。
路由表:
在ASP.NET Web API 中,一個控制器是一個處理HTTP請求的類,Controller中的公共方法稱作action方法或者簡單方法,當Web API框架接收到一個請求,框架將請求路由到一個action。
Web API框架使用路由表(route table)來決定哪一個action被調用。VS的Web API 項目模版創建了一個默認的路由模版:
routes.MapHttpRoute(name: "API Default",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional } );這個路由模版定義在 App_Start目錄下的WebApiConfig.cs文件中。更多關于WebApiConfig的信息 可以看:Configuring ASP.NET Web API .
如果使用自寄宿(self-host)的Web API,必須通過HttpSelfHostConfiguration自己設置路由表,更多信息可以參考:Self-Host a Web API.
路由表中的每個條目包含一個模板,默認的Web API路由模版是“api/{controller}/{id}”。這個模版里,“api”是一個純文本路徑段,{controller}和{id}是占位符(參數變量)。當Web API框架接收到一個請求時,嘗試將URI與路由表中的項(路由模版)匹配,如果沒有可以匹配的路由項,則返回一個404錯誤,比如下面三個uri可以和默認的路由模版進行匹配。
/api/contacts
/api/contacts/1
/api/products/gizmo1
但是/contacts/1這個就匹配不了因為缺少“api"段。
注:Web API 路由模版使用“api”開頭是為了避免與MVC的路由模版沖突,這樣你能夠使用"/contacts"URI去路由到一個MVC controller,而使用"api/contacts" 路由到一個Web API controller。當然,如果你不喜歡,可以修改默認的路由模版。
?
一旦找到匹配的路由,Web API則進行controller和action的選擇:
--To find the controller, Web API adds "Controller" to the value of the {controller} variable.
--匹配action,Web API 查看本次HTTP 方法,比如:如果是GET方法,則在controller中查找Get開頭的方法,這種查詢以HTTP請求方式開頭的action的方式只適合GET , POST , PUT 和 DELETE 方式Http請求???,你可以通過為action添加標識屬性的方法來指定action可匹配的HTTP請求方式以及允許其他的HTTP請求方式。
--其他的路由模版中的占位符變量,比如{id},映射為一個action參數。
下面看一個例子:定義一個如下的controller
public class ProductsController : ApiController {public void GetAllProducts() { }public IEnumerable<Product> GetProductById(int id) { }public HttpResponseMessage DeleteProduct(int id){ } }下面表格展示了不同的URI所調用的action
| HTTP Method | URI Path | Action | 參數 |
| GET | api/products | GetAllProducts | 無 |
| GET | api/products/4 | GetProductById | 4 |
| DELETE | api/products/4 | DeleteProduct | 4 |
| POST | api/products | 沒有匹配的action | ? |
注意:這里的{id}段,如果指定了{id}的值,則調用有id參數的action方法 GetProductById。
因為沒有定義Post開頭的aciton方法,所以POST方式的請求找不到匹配的action。
?
路由拓展
--使用Http Methods 標識屬性:除了定義以HTTP請求方式開頭的action方法外,我們可以使用HttpGet? , HttpPut? ,? HttpPost? 或者 HttpDelete標識屬性來指定一個action方法匹配的HTTP請求方式(與使用HTTP請求方式開頭的方法名效果一樣),例如,下面這個方法可以和GET請求方式的HTTP請求匹配。
public class ProductsController : ApiController {[HttpGet]public Product FindProduct(id) {} }如果一個action方法需要匹配多種HTTP請求方式,或者需要匹配除GET,POST,PUT,DELETE請求方式外的其他請求,可以使用AccptVerbs標識屬性。例如:FindProduct方法可以同時匹配 GET 和 HEAD請求。
public class ProductsController : ApiController {[AcceptVerbs("GET", "HEAD")]public Product FindProduct(id) { }// WebDAV method[AcceptVerbs("MKCOL")]public void MakeCollection() { } }--使用MVC風格的路由
定義路由模版:
routes.MapHttpRoute(name: "ActionApi",routeTemplate: "api/{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional } );在這個路由模版中,{action}參數指定controller中的action的名稱,使用這種風格的路由,需要使用標識屬性指定action允許匹配的HTTP請求方式,比如:必須使用[HttpGet]、[HttpPost]等標識屬性。
public class ProductsController : ApiController {[HttpGet]public string Details(int id); }上面的例子中一個“api/products/details/1”的GET請求,將映射到Details方法。這種風格很像MVC,可能更適合用在一個RPC-style API中。
--使用ActionName屬性定義action的別名:
public class ProductsController : ApiController {[HttpGet][ActionName("Thumbnail")]public HttpResponseMessage GetThumbnailImage(int id);[HttpPost][ActionName("Thumbnail")]public void AddThumbnailImage(int id); }我們可以發送uri為 "api/products/thumbnail/id"的GET請求 map to GetThumbnailImage方法。
發送uri為"api/products/thumbnail/id"的POST請求 map to AddThumbnailImage 方法。
通過上面幾個例子可以看出,可以使用標識屬性,配置一個action方法用作匹配路由的名稱和方法。
--使用[NonAction]標識屬性來指定一個方法不為action方法。
轉載于:https://www.cnblogs.com/zkun/p/4169650.html
總結
以上是生活随笔為你收集整理的Web API-路由(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]Android: 如何实现Scr
- 下一篇: Azure Bill