日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web API-路由(一)

發布時間:2025/7/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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-路由(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。