使用ASP.NET Core 3.x 構建 RESTful API - 2. 什麼是RESTful API

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

1. 使用ASP.NET Core 3.x 構建 RESTful API - 1.準備工作 什麼是REST 什麼是REST REST一詞最早是在2000年,由Roy Fielding在他的博士論文《Architectural Styles and the Design of Network-base ...


1. 使用ASP.NET Core 3.x 構建 RESTful API - 1.準備工作

 

什麼是REST 

REST一詞最早是在2000年,由Roy Fielding在他的博士論文《Architectural Styles and the Design of Network-based Software Architecture》中提的。他在本文中創造了REST這個術語。這篇論文的地址是:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm 

 

REST的全稱是 Representational State Transfer(狀態表述轉換)。這個詞錶面看起來可能不太好理解。但其實REST就是勾畫出了這樣一幅景象,它描述了Web應用到底怎麼樣設計才算是優良的。這裡定義了以下三點: 

  • 一組網頁的網路(一個虛擬狀態機); 

  • 在這些網頁上,用戶可以通過點擊鏈接來前進(狀態轉換); 

  • 點擊鏈接的結果就是下一個網頁(表示程式的下一個狀態)被傳輸到用戶那裡,並渲染好給用戶使用。 

 

論文中還提到REST是一種為分散式超媒體系統所用的架構風格,也就是說,REST定義了一種架構風格來幫助創建和組織出更好的分散式系統。這裡的關鍵詞是架構風格 

概括的說: 

  • REST是一種架構風格,而不是規範或標準; 

  • REST需要使用一些規範、協議或標準來實現這種架構風格; 

  • REST與協議無關。JSON並不是REST強制的,甚至HTTP都不是REST強制使用的,但這也僅僅是從理論上來看。 

 

REST背後的主要思想就是:採用RESTful架構風格進行組織的分散式系統,將在以下幾個方面得到改善: 

  • 性能。REST的通信風格應該是簡單並且高效的,採用它的系統性能應該得以提升。 

  • 組件交互的可擴展性。其實任何分散式系統都允許這種擴展性,而REST所提出的簡單交互方式更是如此。 

  • 組件的可修改性。分散式系統的分散式本質和REST提出的關註點分離,使得組件得以以最小的成本和最低的風險彼此獨立的進行修改。 

  • 可移植性。REST與技術和語言無關,所以使用任何技術都可以實現REST。 

  • 可靠性REST所提出的無狀態約束允許在系統發生故障後輕鬆的恢復系統。 

  • 可視性REST所提出的無狀態約束為所述請求添加了完整的狀態(一會再解釋)。 

 

從上面這個列表,我們可以看出,一個以組件為中心設計的系統非常容易出錯,如果一個組件出現了故障而不影響整個系統的穩定性,那這樣對任何系統都是極有好處的。對組件進行互聯是非常簡單的,但是需要在添加新特性或擴大縮小規模時將風險降至最低。憑藉REST的可移植性,使用REST思想進行設計的系統可以為更廣泛的受眾使用。通過通用的介面,系統可以被更廣泛的開發者所使用。為了實現這些屬性和好處REST使用一組約束來幫助定義統一的介面。 

 

REST的約束 

為了定義REST架構,首先要定義出一個空無的狀態,也就是一個沒有任何約束的系統。在這裡,組件之間的差異就是個迷,然後我們再一個挨一個的往裡面添加約束並保證這些約束可以互不幹擾、融洽相處。這些約束都定義了實現REST API的框架應該如何被構建和設計。下麵就介紹一些這六個約束: 

  • 客戶端-伺服器:關註點分離是這個約束的核心主題。整個Web系統是一個基於客戶端-服務端的系統,客戶端和服務端彼此獨立(獨立實現和部署等),並扮演著不同的角色。它們可以使用不同的語言、技術或平臺,並可以獨自進化,只要它們都遵從Web的統一介面即可。 

  • 無狀態:無狀態表示Web伺服器不被要求記住客戶端程式的狀態,因為這個原因,客戶端在發送請求的時候必須包含所有可能需要的相關信息,也就是說狀態需要被包含在請求里,同時也說明客戶端需要維護自己的狀態。由於維護狀態的工作由客戶端自己來完成了,所以伺服器就節省了很多伺服器資源,這樣伺服器就可以為更多的客戶端服務。 

  • 統一的資源介面/界面:Web組件之間的交互就意味著客戶端、服務端以及基於網路的中介程式都依賴於它們介面的統一性(API和API的消費者之間共用相同標準的一套介面)。Web組件可以在統一介面的四個約束條件下一致的進行互操作。這四個約束是: 

    • 資源的標識:針對RESTful Web API而言,就是指URI,只有得到這個資源標識,才有可能找到該資源並對該資源進行操作。但是從概念上來講,資源和它的表述是分開的。例如,我們通過一個URI找到了服務端的Company這個資源,但是我們得到的Company這個資源的表述和服務端的Company是不一樣的,因為我們得到的是JSON格式(大多數情況)的Company數據。同時還有媒體類型(media type)對其進行描述,例如application/json等。如果請求的是xml格式的數據,那麼我們通常會得到xml格式表述的數據。所以同一個資源得到的表述也可能是不同的(例如JSON vs Xml)。 

    • 通過表述來對資源進行操縱:REST的組件對資源的操作(CRUD)是通過首先獲取該資源現有的表述或者目標表述,然後在組件之間完成從現有表述到目標表述的轉換。換句話講,當客戶端擁有資源表述的時候(包括可能的元數據),那麼它就應該擁有足夠的信息來修改或者刪除伺服器上的資源,前提是客戶端需要有這些許可權。例如,我從伺服器獲取到了Company的資源響應(包括元數據)之後,憑藉這些信息客戶端就應該可以成功的刪除或修改這個Company的資源數據了。但這又是怎麼實現的呢?如果伺服器上的Company API支持對Company進行刪除或者修改,那麼在我們獲取(GET)到這個Company資源的響應後,響應裡面應該包含著刪除或者修改這個Company資源的URI,通過這些URI客戶端就可以完成相應的操作。 

    • 帶有自我描述的信息:由於REST是無狀態的(沒有會話機制),所以發送REST請求的時候,必須把所有相關的信息隨著請求一起發送到伺服器端。換句話說,需要通過使用元數據或者其它方式,讓REST的請求中包含的數據必須帶有“自我描述”性的信息,以便讓對方知道如何處理該請求。 

    • 超媒體作為應用程式狀態的引擎(HATEOAS):REST架構風格中,客戶端是通過超媒體與伺服器端動態提供的一個“應用網路”來進行交互的。這裡要求在首次進入REST網路時有第一個鏈接,還要求客戶端必須具備處理超媒體內容的能力。除此之外REST對客戶端來說再無其它要求。這是書上給出的解釋。舉個例子,本文第二段中提到用戶通過點擊網頁中的鏈接來進行跳轉的時候,瀏覽器的狀態就變化了。這些鏈接就是超文本,而超媒體就是超文本的泛化。針對API來說,它就是程式狀態的引擎。換句話說,超媒體會驅動如何消費和使用API,它會告訴API消費者使用這些API能做什麼,例如:能刪除這個資源嗎?能修改資源嗎?如何能創建這種資源?從哪能獲取這個資源?最終,它還允許自包含文檔的API。 

  • 多層系統:REST的解決方案適用於多層架構,這些層可以被修改,可以被添加或刪除,可以是物理的,也可以是邏輯的。每一層只可以看到和它相鄰的上一層或下一層,其它非相鄰層的結構它完全看不到。這也說明客戶端無法得知它連接的是架構最終層還是連接到了某個中間層。所以REST僅僅知道一個層,也就是對外那一層,因為這個原因,整個系統的複雜性得到了控制,因為可以對任何局部的層次進行替換,而不至於影響整個系統。 

  • 可緩存:每個響應信息必須明確的指出它是否可以被緩存。緩存響應數據可以減少客戶端感知的響應時間,提高整體的可用性和可靠性,並控制整個Web伺服器的負載。客戶端也可以在實時性和響應速度之間做出選擇,以便伺服器端相應的決定是從緩存還是從最終信息源哪裡獲得服務響應的內容。 

  • 按需編碼(可選約束):它描述了伺服器可以擴展或者定製客戶端的功能。例如如果客戶端是一個Web應用,那麼伺服器端可以發送一些javascript腳本給客戶端,以擴展客戶端的功能。但是這也造成了客戶端和伺服器端之間的技術耦合,因為客戶端必須能都懂得伺服器端發過來的代碼,所以這個約束是可選的。 

 

這些就是REST的約束,而沒有實現這些約束的Web API就不是RESTful API,所以現在見到的很多RESTful API並不是真的RESTful API,但是這也不能說明這些API就不好,只不過針對那些沒有實現的約束可能要做出一些權衡取捨,付出一些代價。 

 

Richardson 成熟度模型 

這個成熟度模型是由Leonard Richardson所提出的,這個模型是用來評價API的成熟度。它的結果分為0134共四個級別。我們一個一個看。 

  • Level 0POXPlain old xml)沼澤。它描述了API僅僅是使用HTTP協議來做遠程交互,而HTTP協議的其餘部分都是瞎用的,有時用出了RPC的風格(例如SOAP, 尤其是使用WCF的時候)。例如下麵這個程式都是在同一個URI上面進行讀取資源和創建資源的: 

http. 
post 
• / /h.st/mvapi
  • 換句話說,就是使用HTTP協議作為一種傳輸方式而已,沒有什麼規矩可言。 

  • Level 1,資源。在這級里Level 0不同,每個資源都映射到自己的URI上了但是HTTP方法並沒有正確的使用但是還是降低了一些複雜度。例如下麵這個例子使用了不同的URI,但是HTTP方法使用的都是POST: 

: / authors
  • Level 2,動詞正確使用了HTTP動詞,例如GET、POST、DELETE、PUT、PATCH等等都是按照協議的意圖正確的使用了。狀態碼也正確的使用了,例如200表示成功,201表示創建成功等等。這也符合了統一資源介面/界面這個約束。從軟體開發角度,這也去掉了不必要的變種,因為我們使用同樣的動詞來做同類的事情。例如: 

GET 
200 OZ (auth=s) 
POST 
2 OL (auZhcz)
  • Level 3,超媒體。這意味著,API支持HATEOAS(超媒體作為應用狀態的引擎, Hypermedia as the Engine of Application State,這也是統一資源介面/界面約束裡面的一條例如: 

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

-Advertisement-
Play Games
更多相關文章
  • 在說正題之前先解釋一下交換機模式是個籠統的稱呼,它不是一個單獨的模式(包括了訂閱模式,路由模式和主題模式),交換機模式是一個比較常用的模式,主要是為了實現數據的同步。 首先,說一下訂閱模式,就和字面上的意思差不多主要就是一個生產者,多個消費者,同一個消息被多個消費者獲取,先看一下官網的圖示 整體執行 ...
  • 當創建隊列jobs、監聽器或訂閱伺服器以推送到隊列中時,您可能會開始認為,一旦分派,隊列工作器決定如何處理您的邏輯就完全由您自己決定了。 嗯……並不是說你不能從作業內部與隊列工作器交互,但是通常情況下,哪怕你做了,也是沒必要的。 這個神奇的騷操作的出現是因為“InteractsWithQueue”這 ...
  • 環境:MacOS 10.13 MAMAP Prophp 7.0.33 + xdebugVisual Studio Code前言我所理解的 POP Chain:利用魔術方法並巧妙構造特殊屬性調用一系列函數或類方法以執行某種敏感操作的調用堆棧反序列化常用魔法函數前言我所理解的 POP Chain:利用魔 ...
  • 【ASP.NET Core學習】在ASP.NET Core 種使用Entity Framework Core介紹,包括如何添加Entity Framwork Core,創建模型和遷移到資料庫,查詢數據,保存數據,使用事務,處理併發衝突 ...
  • [toc] 前言 在之前已經提到過,公用類庫Util已經開源,目的一是為了簡化開發的工作量,畢竟有些常規的功能類庫重覆率還是挺高的,二是為了一起探討學習軟體開發,用的人越多問題也就會越多,解決的問題越多功能也就越完善, 倉庫地址: "April.Util_github" , "April.Util_ ...
  • 在面對對象編程中,類的三大特性分別為封裝,繼承,多態。其中多態的具體實現,依賴於三個方法,也就是虛方法,抽象類和介面。 多態的具體作用是什麼呢?或者說多態的存在有什麼意義呢?多態的存在有效的降低了程式的耦合度,在使用的時候,不僅可以表現大家都有的共性,還能在必要的時候突出一些特殊的的個性。 那麼如何 ...
  • 近期和幾位做嵌入式開發的朋友閑聊過程中,一位朋友抱怨到:這C#太難用了,我想在N個窗體(或者是N個用戶組件之間)傳遞值都搞不定,非得要定義一個全局變數來存儲,然後用定時器來刷新值,太Low了。我急切的回答道:這很簡單,不就是委托的事嘛。那你來一個示例啊:朋友道。此為這篇博客的起因,所以此篇博客對於有 ...
  • wpf 兩個自定義控制項 一個是IP控制項,一個滑動條。先看下效果圖 IPControl 1、實際工作中有時需要設置IP信息,就想著做一個ip控制項。效果沒有window自帶的好,需要通過tab切換。但也能滿足使用。廢話不多說直接上代碼 IPControl.xaml IPControl.xaml.cs 2 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...