第一節:WebApi的純原生態的RestFul風格接口和路由規則介紹


一. 原生態接口

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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM