使用ASP.NET Core 3.x 構建 RESTful API - 3.2 路由和HTTP方法

ASP.NET Core 3.x 的路由

路由機制會把一個請求的URI映射到一個Controller上面的Action,因此當你發送一個HTTP請求的時候,MVC框架會解析這個請求的URI,並嘗試着把它映射到一個Controller上面的Action 數據庫

 

兩個路由中間件 api

ASP.NET Core 3.x裏面,建議使用Endpoint路由來進行設置。可是咱們須要先在請求的管道里面添加兩個中間件: 服務器

  • app.UseRouting()。它是用來標記路由決策在請求管道里發生的位置,也就是在這裏會選擇端點。 app

  • app.UseEndpoints()。它是用來標記選擇好的端點在請求管道的什麼地方來執行。 框架

這樣作的好處就是,咱們能夠在選擇端點和執行端點的中間位置插入其它的中間件。這樣的話,插入到中間位置的中間件就會知道哪一個端點被選取了,並且它也有可能會選擇其它的端點。 async

 

一個很是好的例子就是受權中間件: visual-studio

app . UseRouting( ) ; 
app . UseAuthorization( ) ; 
app . UseEndpoints( endpoints 
endpoints .MapControllers( ) ;

若是受權成功,那麼就繼續執行到以前選定的端點,不然的話就會跳轉到其它端點或者短路返回。 spa

 

 

映射端點 orm

仍是能夠有兩種方式進行設置:基於約定 或者 基於屬性 

基於約定的路由,例如這兩種: 

app . UseEndpoints( endpoints 
endpoints . MapControllerRoute( 
"default", 
name : 
" {controller=Home} ) ; 
pattern: 
endpoints .MapRazorPages( ) ;

這種方式更適合於服務器端的Web應用程序。 

 

而針對Web API,使用基於屬性的路由更加適合: 

app . UseEndpoints( endpoints 
endpoints .MapControllers( ) ;

能夠看到,這裏面僅僅映射了Controller,並無使用任何約定,因此咱們須要採用屬性(Attribute)來進行設定。這裏須要用到屬性(attribute)和URI模板。 

  • 屬性(Attribute)。例如[Route][HttpGet][HttpPost]等等,能夠把它們放在Controller級別,也能夠放在Action級別上。 

  • URI模板。將屬性結合URI模板一塊兒使用,就能夠把請求映射到ControllerAction上面。 

 

例如: 

ApiController] 
Route( template: "api/companies " ) ] 
I reference 
public class CompaniesController 
ControllerBase 
private readonly ICompanyRepository 
companyRepos i tory ; 
O references 
public CompaniesController(ICompanyRepository companyRepository) 
HttpGet 
O references 
public async Task<IActionResult> GetCompanies() 
await companyRepository .GetCompaniesAsync() ; 
var companies = 
return new JsonResult(companies);

 

官方文檔:路由基礎知識 

 

HTTP 方法

不一樣的動做能夠做用於相同的資源URI,例如獲取一個公司(api/company/3)和刪除一個公司(api/company/3)的URI就是同樣的。可是它們的HTTP方法則不一樣,一個是GET,一個是DELETE。下面咱們就來看看那些動做應該對應哪些 HTTP 方法 

 

POST 

需求:添加一個公司信息。 

需求圖解: 

添 加 
, 加 好 的 
公 司 信 , 
公 司 信 , 
公 司 資 源

 

HTTP請求圖解: 

POST api/companies 
POST 對 應 的 操 做 
就 是 建 立 資 源 
POST 的 參 數 放 在 
請 求 的 body 裏 面 
POST 
ompany 信 息 
在 body 裏 
pi/companies/{ 生 成 的 id} 
的 內 容 
POST 請 求 應 該 返 回 新 創 建 的 資 源 
以 及 可 以 獲 取 該 資 源 的 惟 一 標 識 U 剛 
api/Compan ies

 

文字解釋: 

添加公司這個需求的HTTP表示就是 POST api/companies 

當咱們向 api/companies這個標示添加一個公司信息的時候,就會利用提供的公司信息建立一個公司的資源。這裏對應的HTTP方法是POST 

POST請求的參數一般存放在請求的body裏面,因此公司的信息就放在了body裏面。 

當公司資源建立好以後,這個action應該返回新建立的資源以及能夠獲取該資源的路徑標識,也就是api/companies/{新資源的id} 

 

GET 

獲取單個資源 

需求:獲取一個公司信息 

需求圖解: 

獲 取 
公 司 信 
公 司 資 源

 

HTTP請求圖解: 

GET api/companies/{compayld} 
GET 對 應 的 動 做 就 是 
獲 取 資 源 
G ET 
GET 請 求 會 返 回 請 求 路 徑 所 對 應 的 資 源 
pi/companies/{companyld} 
的 內 容 
不 需 要 參 數 
api ℃ ompanies/{companyld} 
通 過 這 種 形 式 (URI) 來 表 示 公 司 資 源 中 的 一 個 公 司

 

文字解釋: 

咱們想要經過 api/companies/{companyId} 這個標示來獲取一個公司資源,這裏就須要使用HTTP GET 方法,放在一塊兒就是 GET api/companies/{companyId} 

GET請求老是會返回請求 URI 所對應的資源,因此這個請求會返回這個資源的內容。 

 

獲取集合資源 

需求:獲取符合查詢條件的公司資源 

需求圖解: 

獲 取 
符 合 條 件 的 
公 司 信 息 
查 詢 條 件 
公 司 資 源

 

HTTP請求圖解: 

GET api/companies?param1=xx&param2=xx... 
GET 對 應 的 動 做 就 是 
獲 取 資 源 
GET 
GET 請 求 會 返 回 請 求 路 徑 所 對 應 的 資 源 
pi/companies/{companyldl} 
api/companies/{companyldn} 
的 內 容 
自 定 義 的 
查 詢 參 
G ET 的 參 數 是 資 源 地 址 ? 後 邊 的 部 分 , 
例 如 GET api/companies?name=Nick 
api.Com pan ies

 

這個需求是按條件搜索資源,可能返回0個或者多個符合條件的資源。這裏咱們使用HTTP的GET方法,若是想獲取全部的公司資源,那麼請求路徑是 api/companies;若是想獲取符合查詢條件的公司資源,那麼請求裏就須要一些參數,一般使用查詢字符串(query string)來傳遞參數,例如: 

GET api/someresources?param1=value1&param2=value2 

GET api/products?xxxxx=something 

在這裏,參數是在問號?後邊,以name=value的形式存在。若是有多個查詢參數,它們之間使用 & 符號分隔開 

當搜索資源的工做結束後,GET請求會返回匹配該路徑(包括參數部分)的資源。 

 

DELETE 

需求:刪除一個公司 

需求圖解: 

刪 除 
公 司 資 源

 

HTTP請求圖解: 

DELETE api/companies/{companyld} 
G ET 
DELETE 會 
刪 除 路 徑 所 對 應 的 資 源 
沒 有 返 回 
沒 有 參 數 
api ℃ ompanies/{companyld} 
通 過 這 種 形 式 (URI) 來 表 示 公 司 資 源 中 的 一 個 公 司

 

文字解釋 

HTTP  DELETE 方法就很好理解了,就是刪除指定路徑的資源而已,並且不須要返回任何東西。 

 

PATCH 

需求:更新公司的信息。 

需求圖解: 

公 司 信 息 
公 司 資 源

 

HTTP請求圖解: 

РАТСН api/companies/{companyld} 
РАТСН 
РАТСН 
/lEfZ,a 
РАТСН$]ЗИ 
api/companies/{companyld}

 

文字解釋: 

這裏有些初學者可能會出錯。HTTP 用來表示更新信息的方法是 PATCH,因此整個請求時 PATCH api/companies/{companyId}。注意PATCH表示對資源進行局部更新。 

和POST同樣,PATCH的參數也位於請求的body裏面。例如,若是你想更新公司的名稱,那麼就要把新的公司名稱放在body裏面。 

PATCH的請求無需返回任何東西。 

 

PUT 

需求:替換公司信息。 

需求圖解: 

替 換 
公 司 信 息 
公 司 資 源

 

HTTP請求圖解: 

PUT api/companies/{compayld} 
PUT 會 完 全 替 換 資 源 
PUT 
公 司 信 息 
在 body 裏 
PUT 的 參 數 在 
請 求 的 body 裏 
可 選 : 如 果 資 源 原 本 不 存 在 , 那 麼 就 創 建 資 源 。 
這 種 情 況 下 就 應 該 返 回 新 創 建 的 資 源 。 
如 果 資 源 原 來 存 在 , 就 進 行 替 換 操 做 , 
那 麼 就 無 需 返 回 任 何 東 西 。 
•api/companies/{companyld} 
的 內 容 
api/companies/{companyld} 
通 過 這 種 形 式 (URI) 來 表 示 公 司 資 源 中 的 一 個 公 司

 

文字解釋: 

HTTP  PUT 方法用於徹底替換已存在的一個資源;或者若是標識URI對應的資源不存在,那麼就建立一個資源。對於後一種狀況,它的效果和添加操做是同樣的。 

 POST 同樣,PUT的參數也位於請求的body裏面 

若是是替換現有資源,那麼無需返回任何東西;但若是是建立資源的操做,就應該返回新建立的資源。 

 

綜上 

經過HTTP方法可進行的CRUD基本操做已經介紹的差很少了,可是這裏的CRUD只是從API消費者的角度而言。例如,DELETE api/companies/12 並不意味着id爲12的公司信息從數據庫中被刪除了,也許只是把該公司的信息的狀態設置爲deleted而已。 

對於不限於CRUD的其它操做,咱們也得使用這些HTTP方法來進行表示,多少要進行一些妥協。 

 

最後使用一張圖表總結一下這些HTTP方法對應的操做: 

 

實際上還有 HTTP  OPTIONS 和 HEAD 也會直接或者間接的用到,這倆之後再說吧。

相關文章
相關標籤/搜索