Web Api 的 路由機制


ASP.NET Web API 是一種框架,用於輕松構建可以訪問多種客戶端(包括瀏覽器和移動設備)的 HTTP 服務。 ASP.NET Web API 是一種用於在 .NET Framework 上構建 RESTful 應用程序的理想平台。

所以我們要想學習web api 就要去了解它的路由機制。MVC和web api的路由機制的主要區別是web api 使用的是http 方法而不是url 的路徑。本文就演示一下web api 是怎樣在controller 里映射 http 請求的。

web api 路由
    在 web api 中 controller 是用來操作http 請求的。它里面的action 方法 對應不同的http 請求的方法。當 web api 收到一個http 請求的
時候 ,路由表就會將請求映射到對應的action 方法中。
路由表的定義是在 App_Start文件夾的WebApiConfig.cs類中,路由的定義其實和mvc 的差不多的。

 1 public static void Register(HttpConfiguration config)
 2 {
 3 // Web API configuration and services
 4 
 5 // Web API routes
 6 config.MapHttpAttributeRoutes();
 7 
 8 config.Routes.MapHttpRoute(
 9 name: "DefaultApi", //這個可以隨意命名
10 routeTemplate: "api/{controller}/{id}",//web api 的地址
11 defaults: new { id = RouteParameter.Optional }
12 );
13 }

 

在 Global.asax 中注冊 路由。

1 protected void Application_Start()
2 {
3 AreaRegistration.RegisterAllAreas();
4 
5 WebApiConfig.Register(GlobalConfiguration.Configuration);//注冊 api 路由 必須寫在mvc 路由注冊之前否則會找不到。
6 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
7 RouteConfig.RegisterRoutes(RouteTable.Routes);
8 }

 

當web api 框架收到http 請求的時候,它會嘗試的去從路由表中的模板中匹配這個URL,如果不匹配將會顯示404的錯誤。比如我們注冊的這個模板就
會匹配一下的地址:

api/WebApi
api/WebApi/2222
api/Home/werwrwe

下面的就不會匹配,因為他們少了api/這個參數:

WebApi
WebApi/2222
Home/werwrwe

這個api/的參數是為了避免和mvc 的 路由有所沖突,當然你可以隨意的去命名。

 一旦請求的地址被匹配,web api 將會選擇相對應controller 和 action

  • 1,模板中的{controller}將對應請求地址中的controller。
  • 2,web api 將會根據http 請求的方法來找到以這個方法的名字開頭的 action ,比如說如果請求的是GET 方法,web api 就會找 以get 開頭 action,getname getdata 等等。僅僅適用於 GET,POST,PUT,DELETE這四種方法。當然還可以設置其他的方法,需要在controller 上添加屬性。
  • 3,模板中的占位符比如{id} 用來匹配傳進來的參數的。

比如 :

1 public class TestController : ApiController
2 {
3 public IEnumerable<TestModel> GetAllData() { }
4 public TestModel GetDataById(int id) { }
5 public HttpResponseMessage Delete(int id){ }
6 public HttpResponseMessage Post(TestModel test){}
7 public HttpResponseMessage Put(TestModel test){}
8 }

下面是每個http 請求對應的 action 方法:

 

 Http 請求方法  對應的 action     url   參數  操作
 GET    GetAllData/GetDataById   api/webapi/1  1  獲取
POST     Post    api/webapi                     添加                    
DELETE  Delete   api/webapi    刪除
PUT  Put   api/webapi    更新 

 

 

 

 

 

設置action 特性來接受http 請求
這個是接受get 請求的,action 的名字可以不用get 開頭。

1 public class TestController : ApiController
2 {
3 [HttpGet]
4 public IEnumerable<TestModel> Find() { }
5 }

 

還可以接受那四個請求之外的http 請求或者多個請求:

1 public class TestController : ApiController
2 {
3 [AcceptVerbs("GET", "HEAD")]
4 public IEnumerable<TestModel> Find() { }
5 
6 [AcceptVerbs("MKCOL")]
7 public void Deatil() { }
8 }

 

我們還可以按照mvc 的方式來定義 web api 的模板,比如:

1 routes.MapHttpRoute(
2 name: "api",
3 routeTemplate: "api/{controller}/{action}/{id}",
4 defaults: new { id = RouteParameter.Optional }
5 );

 

它就可以和api/test/find 相匹配。
我們還可以在action 上定義action 的名字:

1 public class TestController : ApiController
2 {
3 [AcceptVerbs("GET", "HEAD")]
4 [ActionName("test")]
5 public IEnumerable<TestModel> Find() { }
6 }

 那么api/test/test 就可以進入上面的那個方法。

如果設置NoAction

1 public class TestController : ApiController
2 {
3 
4 [NonAction]
5 public IEnumerable<TestModel> Find() { }
6 }

 那么web api 就不會認為它是一個 action 即使與模板匹配也不會被調用。

 


免責聲明!

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



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