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

来源:https://www.cnblogs.com/cgzl/archive/2019/11/24/11924700.html
-Advertisement-
Play Games

ASP.NET Core 3.x 的路由 路由機制會把一個請求的URI映射到一個Controller上面的Action,所以當你發送一個HTTP請求的時候,MVC框架會解析這個請求的URI,並嘗試著把它映射到一個Controller上面的Action。 ASP.NET Core 3.x 的路由 路由 ...


ASP.NET Core 3.x 的路由

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

 

兩個路由中間件 

ASP.NET Core 3.x裡面,建議使用Endpoint路由來進行設置。但是我們需要先在請求的管道裡面添加兩個中間件: 

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

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

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

 

一個非常好的例子就是授權中間件: 

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

如果授權成功,那麼就繼續執行到之前選定的端點,否則的話就會跳轉到其它端點或者短路返回。 

 

官方文檔:Startup裡面路由配置的官方文檔 

 

映射端點 

還是可以有兩種方式進行設置:基於約定 或者 基於屬性 

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

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 也會直接或者間接的用到,這倆以後再說吧。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] 靜態文件 預設情況下所有的html文件都是放在templates文件夾內 什麼是靜態文件 網站所使用的提前寫的css、js 第三方的前端模塊、圖片都叫做靜態資源 預設情況下網站使用的靜態資源全部會放到static文件夾下 通常情況下 在static文件夾內部還會再建其他文件夾 這是為了更 ...
  • 目前主流的三種web服務交互方案: REST (Representational State Transfer) 表徵性狀態轉移 SOAP (Simple Object Access Protocol)簡單的對象訪問協議 XML RPC (XML Remote Procedure Call)基於XM ...
  • 一、背景 書接手寫MQ框架(二)-服務端實現 ,前面介紹了服務端的實現。但是具體使用框架過程中,用戶肯定是以客戶端的形式跟服務端打交道的。客戶端的好壞直接影響了框架使用的便利性。 雖然框架目前是通過web的形式提供功能的,但是某的目標其實是通過socket實現,所以不僅需要有客戶端,還要包裝一下,讓 ...
  • 一、起航 本著從無到有,從有到優的原則,所以計劃先通過web實現功能,然後再優化改寫為socket的形式。 1、關於技術選型 web框架使用了之前寫的gmvc框架(手寫MVC框架(一)-再出發),消息存儲採用存在資料庫的方式,使用的框架也是前段時間寫的gdao(手寫DAO框架(一)-從“1”開始 ) ...
  • golang中連接mysql資料庫,需要使用一個第三方類庫github.com/go-sql-driver/mysql,在這個類庫中就實現了mysql的連接池,並且只需要設置兩個參數就可以實現 一般連接mysql首先需要調用sql.Open函數,但是此時並沒有真正的去連接mysql,而是只創建了一個 ...
  • 1.註釋 合理的代碼註釋應該占源代碼的 1/3 左右,Python 語言允許在任何地方插入空字元或註釋,但不能插入到標識符和字元串中間。 在 Python 中,通常包括 3 種類型的註釋,分別是單行註釋、多行註釋和中文編碼聲明註釋: 單行註釋: Python 中使用井號( # )作為單行註釋的符號, ...
  • 我的專業與互聯網沒有太大關係,接觸博客還是工作以後的事情。隨著工作的經驗增加,總想將自己的所思所得記錄下來,畢竟,好記性不如爛筆頭。 ...
  • 一、Java 基礎 1. JDK 和 JRE 有什麼區別? JDK:Java Development Kit 的簡稱,java 開發工具包,提供了 java 的開發環境和運行環境。 JRE:Java Runtime Environment 的簡稱,java 運行環境,為 java 的運行提供了所需環 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...