中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WebApi特性路由

發布時間:2020-07-30 12:25:05 來源:網絡 閱讀:617 作者:zdx墨涵 欄目:開發技術

特性路由

WebApi2默認的路由規則我們稱作基于約定路由,很多時候我們使用RESTful風格的URI.簡單的路由是沒問題的,如 api/Products/{id},但有些事很難處理的,如資源之間存在嵌套關系:客戶包含訂單,書有作者屬性等等。對于這種Uri,我們希望的路由是這樣的:/costomers/{customerid}/orders  /costomers/{customerid}/orders/{orderid}

考慮到這只是某個Controller的路由格式,而我們會有很多個Controller,用基于約定路由顯然不合適(要配置很多的路由)

使用特性路由就簡單了,在action上加一個特性即可

[Route("customers/{customerId}/orders")]public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

 

通過使用特性路由,我們還可以做API的版本控制

/api/v1/products
/api/v2/products

 

啟用特性路由需要在配置過程中調用System.Web.HttpConfigurationExtensions類的MapHttpAttributeRoutes方法

WebApi特性路由

using System.Web.Http;namespace WebApplication
{    public static class WebApiConfig
    {        public static void Register(HttpConfiguration config)
        {            // Web API routes            config.MapHttpAttributeRoutes();            // Other Web API configuration not shown.        }
    }
}

WebApi特性路由

 

在WebApi1中  項目模板是這樣的

protected void Application_Start()
{
    WebApiConfig.Register(GlobalConfiguration.Configuration);    //。。。}

 

如果要啟用特性路由,需要改成如下代碼

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);    //。。。}

 

:特性路由和基于約定路由是可以結合使用大的。

 

HttpMethod

默認情況,WebApi會根據action的方法名前綴查找action(不區分大小寫),比如GetUsers,會匹配Get。通過在action上添加HttpMethod特性,可以覆蓋action需要映射的Http Method。

可使用的特性包括:[HttpDelete],[HttpPost],[HttpHead],[HttpOptions],[HttpPatch],[HttpGet],[HttpPut]

通過AcceptVerbs特性,我們還可以指定非標準方法以及多個方法,如 [AcceptVerbs("MKCOL","GET","POST")]

 

路由前綴

通常情況下,一個Controller下的action會使用相似的路由模板,如

  • [Route("api/books")]

  • [Route("api/books/{id:int}")]

  • [Route("api/books/{bookid}/authors")]

這時候可以為整個controller指定[RoutePrefix]特性,以使用共同的前綴,把[RoutePrefix("/api/books")]加到controller上,action的路由特性就變成這樣:

  • [Route("")]

  • [Route("{id:int}")]

  • [Route("{bookid}/authors")]

此外,路由前綴中也可以包含參數,如[RoutePrefix("api/{userid}/books")]

這里還有兩個小技巧

如果有某個特殊路由不希望使用前綴,可以在路由中添加~,如[Route("~api/otherbooks")]

有時候需要幾個路由片段結合起作用,如日期 /api/books/date/2013/06/17

這時候就需要使用字符* ,[Route("date/{*date:datetime:regex(\\d{4}/\\d{2}/\\d{2})}")],不過這種參數只能用作路由的最后一個參數

 

 

路由約束

路由約束讓我們可以限制模板參數的匹配方式。一般的語法是 "{參數:約束類型}":

[Route("users/{id:int}"]public User GetUserById(int id) { ... }

[Route("users/{name}"]public User GetUserByName(string name) { ... }

 

如果參數int,則選中第一個GetUserById,否則是GetUserByName。(跟方法定義的順序無關)

下面的表格列出了支持的約束

約束介紹示例
alpha匹配大寫或小寫字母 (a-z, A-Z){x:alpha}
bool
{x:bool}
datetime
{x:datetime}
decimal
{x:decimal}
double
{x:double}
float匹配一個 32位浮點數{x:float}
guid
{x:guid}
int
{x:int}
length匹配一個長度在指定范圍內的字符串{x:length(6)}
{x:length(1,20)}
long
{x:long}
max匹配指定了最大值的整數{x:max(10)}
maxlength匹配指定了最大長度字符串{x:maxlength(10)}
min匹配指定了最小值的整數{x:min(10)}
minlength匹配指定了最小長度字符串{x:minlength(10)}
range匹配指定了大小區間的整數{x:range(10,50)}
regex匹配一個正則表達式{x:regex(^\d{3}-\d{3}-\d{4}$)}

 如果要指定多個約束,需要用冒號間隔 [Route("users/{id:int:min(1)}")]

通過實現IHttpRouteConstraint接口,還可以創建自定義路由約束。(不過一般正則就可以搞定了)

還可以通過實現IInlineConstraintResolver接口替換整個DefaultInlineConstraintResolver類。這樣做將取代所有的內置的約束,除非實現IInlineConstraintResolver的類將它們添加進去。

WebApi特性路由 自定義路由約束Demo

  

可選URI參數,默認值

 通過在參數約束后面添加一個問號,可以設定URI參數是可選的;也可以像普通方法那樣指定默認值:

[Route("api/books/locale/{lcid:int?}")]public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
[Route("api/books/locale/{lcid:int=1033}")]public IEnumerable<Book> GetBooksByLocale(int lcid) { ... }

 

 這兩者是等價的

 

路由名稱

WebApi中,每一個路由都有一個名字,用于生成鏈接,并在放入Http響應中。(應該是用于重定向吧) 

例如對某個action A指定Name,[Route("api/books/{id}", Name="GetBookById")]

那么其他action B在需要返回這個action A的鏈接時,就可以這樣使用

WebApi特性路由

public HttpResponseMessage Post(Book book)
{    var response = Request.CreateResponse(HttpStatusCode.Created);    string uri = Url.Link("GetBookById", new { id = book.BookId });
    response.Headers.Location = new Uri(uri);    return response;
}

WebApi特性路由

 

 

路由順序

通過設定特性[Route("xxx",RouteOrder=n)]可以指定路由的查找順序

[Route("pending", RouteOrder = 1)]public HttpResponseMessage GetPending() { ... }

 

不過意義不大,通過順序來控制,還不如設定更好的路由來的實際,而且不至于讓開發人員覺得混亂。

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#order

 

 

翻譯:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2


(注):相關文檔請看https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沂源县| 闻喜县| 黎城县| 德惠市| 南丹县| 浮山县| 新民市| 兴国县| 栖霞市| 昌图县| 库伦旗| 花莲县| 石河子市| 称多县| 高陵县| 清徐县| 家居| 兴安县| 浦东新区| 马尔康县| 丰城市| 临城县| 永川市| 建德市| 施秉县| 武城县| 武定县| 大安市| 云南省| 寻甸| 嘉兴市| 成武县| 景泰县| 洛阳市| 阆中市| 渭源县| 河北省| 长治县| 元江| 屏东市| 玉屏|