一. 原生態接口
1. 從默認路由開始分析
在WebApiConfig.cs類中的Register方法中,我們可以看到默認路由如下:
分析:請求地址在 controller 前面需要加上 api/,controller后面沒有action,最后有一個參數{id},webapi默認的路由規則就是一種RestFul風格的接口調用規則。
2. WebApi的默認調用規則
(1). 方法名默認為Get或者GetXXX開頭的只接受get請求,默認為Post或者PostXXX開頭的只接受Post請求,如果標注[HttpGet]、[HttpPost]等特性的話,則以特性為主。
(2). 不以GetXX或者PostXX等特殊開通的通過標注[HttpGet]等特性,也可以進行訪問, 比如下面的UserInfor方法,通過添加[HttpGet]特性,就可以進行Get訪問了。
PS:其它特殊的調用接受規則,詳見下一節。
3. 實戰測試
前提:以下所有的Action,都位於FirstController下,路由規則使用的是WebApi的默認路由規則。
(1).無參Get方法
請求方式:Get請求,請求地址:http://localhost:2131/api/First
(2).有參數的Get方法,參數名為int id
請求方式:Get請求,請求地址:http://localhost:2131/api/First/5 或者 http://localhost:2131/api/First/?id=5
分析:默認的路由規則:api/{controller}/{id},最后一個是 {id},而該方法的參數名也為id,所以可以 api/First/5 拼接,如果這里路由規則為:api/{controller}/{id2},方法的參數名必須為 int id2,才可以 api/First/5 這樣拼接。
(3). 有參數的Get方法,參數名為 int id2
分析:該方法和上述的Get(int id)不能共存,因為不滿足重載規范,該方法只能通過 api/First?id2=111 的模式進行Get請求,不能通過api/First/2的模式進行請求,因為路由中最后一位是 {id}而不是{id2}。
(4). 有string參數的Get方法
請求方式:Get請求,請求地址分別為:http://localhost:2131/api/First/?userName=5 、http://localhost:2131/api/First/?str=5
(5). 多個參數且不以Get開頭,標注[HttpGet]特性
請求方式:Get請求,請求地址為:http://localhost:2131/api/First/?id=5&name=ypf
(6). 帶一個參數的Post請求
請求方式如下:
(7). 帶一個參數的Delete請求
請求方式:Delete 請求地址:http://localhost:2131/api/First/?id=5 或者 http://localhost:2131/api/First/5
(8). 帶一個參數的Put請求
存在問題:postman請求,服務器端拿不到value的值。?? 稍后解決
二. 路由規則
1. 簡介:
WebApi有兩種路由規則,默認路由和特性路由,都位於WebApiConfig類中的Register方法里進行配置,
(1). config.MapHttpAttributeRoutes(); 代表特性路由
(2). config.Routes.MapHttpRoute(); 代表統一的默認路由
特別注意:特性路由的優先級 大於 默認路由的優先級
2. 默認路由
WebApi的默認路由為:routeTemplate: "api/{controller}/{id}",不含action,且最后一個參數名為id,只有參數名為id的時候才可以通過api/xxx/1 這種方式進行訪問。
默認路由可以同時聲明多個,只要里面的name值不一樣即可,滿足任何一個路由規則都可以訪問。
演示:增加兩個路由,名字分別為:DefaultApi2和DefaultApi3,下面的GetUseName方法,通過這兩個路由規則: api2/Third/GetUserName?userName=1234 或者 api3/Third/GetUserName?userName=1234 都可以訪問
(PS:需要注釋掉相關的:[RoutePrefix]和[Route])
服務器端代碼:
3. 特性路由
(1). 可以通過[Route]和[RoutePrefix]這兩個標記來自定義路由規則,[Route]作用於action,[RoutePrefix]作用於Controller, 一旦設置了其中任何一個,默認路由routeTemplate就不起任何作用了。
(2). 當[RoutePrefix]和[Route]都存在的話,規則為二者的拼接結合,先[RoutePrefix] 后[Route]
案例測試
A:下面的GetM1(string userName)方法,增加特性: [Route("myApi/Third/GetM1")],注視掉控制器上的[RoutePrefix]特性,保留默認路由DefaultApi2和DefaultApi3, 則該方法需要通過:http://localhost:2131/myApi/Third/GetM1?userName=1234 進行訪問。
B:下面的GetM2(string userName)方法,增加特性: [Route("myApi/Third/GetM2")],控制器上增加[RoutePrefix("ypfApi/Third")],保留默認路由DefaultApi2和DefaultApi3, 則該方法需要通過:http://localhost:2131/ypfApi/Third/myApi/Second/GetM2?userName=1234 進行訪問。
C:下面的GetFullName(string firstName,string lastName)方法,增加特性: [Route("myApi/Third/GetFullName/{firstName}/{lastName}")],注視掉控制器上的[RoutePrefix]特性, 保留默認路由DefaultApi2和DefaultApi3。
則該方法可以通過:http://localhost:2131/myApi/Third/GetFullName/姚/大寶 進行訪問
1 //[RoutePrefix("ypfApi/Third")] 2 public class ThirdController : ApiController 3 { 4 /// <summary> 5 /// 演示多個默認路由的情況 6 /// 需要把控制器的特性注釋掉!需要把WebApiConfig中的 DefaultApi2和DefaultApi3兩個路由打開,其他的都注釋掉 7 /// </summary> 8 /// <param name="userName"></param> 9 /// <returns></returns> 10 [HttpGet] 11 public string GetUserName(string userName) 12 { 13 return $"userName的值為{userName}"; 14 } 15 16 /// <summary> 17 /// 演示淡出的[Route]特性 18 /// </summary> 19 /// <param name="userName"></param> 20 /// <returns></returns> 21 [Route("myApi/Third/GetM1")] 22 [HttpGet] 23 public string GetM1(string userName) 24 { 25 return $"GetM1您的返回值為:{userName}"; 26 } 27 28 /// <summary> 29 /// 演示[RoutePrefix]和[Route] 30 /// </summary> 31 /// <param name="userName"></param> 32 /// <returns></returns> 33 [Route("myApi/Third/GetM2")] 34 [HttpGet] 35 public string GetM2(string userName) 36 { 37 return $"GetM2您的返回值為:{userName}"; 38 } 39 40 /// <summary> 41 /// 演示自定義[Route]的特殊寫法 42 /// </summary> 43 /// <param name="firstName"></param> 44 /// <param name="lastName"></param> 45 /// <returns></returns> 46 [Route("myApi/Third/GetFullName/{firstName}/{lastName}")] 47 [HttpGet] 48 public string GetFullName(string firstName,string lastName) 49 { 50 return $"firstName值為{firstName},lastName值為{lastName}"; 51 } 52 53 }
5. 特性路由的作用
(1). 標記特殊的訪問路徑,該功能有點雞肋,用的比較少。
(2). 多版本控制的時候會使用. (后面介紹)
!
- 作 者 : Yaopengfei(姚鵬飛)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
- 聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。