使用REST風格架構您需要知道的一些事

来源:http://www.cnblogs.com/vipyoumay/archive/2017/12/15/8042924.html
-Advertisement-
Play Games

REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟體架構風格 ...


1. REST的由來

REST即表述性狀態傳遞(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟體架構風格。

上世紀90年代面對高速發展的互聯網規模,HTTP1.0需要進一步改進。Roy Fielding 著手制定HTTP1.1的標準及後續擴展工作。HTTP1.1重視降低WEB系統開發的複雜性(通過增強HTTP的請求頭和響應頭),提高系統的可擴展性(通過更容易的緩存指令)以及其他性能優化工作(比如長連接和多個請求和響應可以重疊等)。

Roy Fielding在制定HTTP時有一個願景:Web世界的應用程式應隨著不斷的超連接跳轉來實現應用系統狀態遷移,所以HTTP應該是一個應用協議,而不是一個純粹的超文本傳輸協議。

這就是REST的由來。當我們在談論REST的時候,表示我們在談論Web世界的應用一種基於HTTP的架構風格。

2. REST的構成

2017-12-10-20-52-26

2.1. 資源

在restful中資源是核心抽象,任何會被互聯網組件訪問的信息都是資源,並用一個URL/URN來標識。
舉例來說,獲取某網站的2017年10月1號的天氣信息,該網站可以命名改信息為http://www.somesite.com/weather/2017/10/1或者 http://www.somesite.com/weather?year=2017&month=10&day=1。客戶端瀏覽器能用GET方法合法的獲取該資源。

如果天氣採集人員要創建2017年10月1號的天氣信息,則用POST方法提交表單給http://www.somesite.com/weather完成創建資源工作。
http://www.somesite.com/weather並沒有制定哪一天的天氣信息,但它確實資源,這體現資源的抽象性。

2017-12-05-22-08-41

2.2. 資源的表述

資源的表述是指資源的表現形式,這些形式由請求方和資源提供方通過HTTP協商指定。包括以下內容:

2.2.1. MIME(Multipurpose Internet Mail Extensions)

MIME是多用途互聯網郵件擴展類型,它是一個互聯網標準,擴展了電子郵件標準,使其能夠支持:
非ASCII字元文本;非文本格式附件(二進位、聲音、圖像等);由多部分(multiple parts)組成的消息體;包含非ASCII字元的頭信息(Header information)。

比如下圖,客戶端表示能接受json(首選),text(次選)以及任意格式(再次選);伺服器端返回json內容給客戶端:

2017-12-06-20-54-01

2.2.2. 緩存約定

所以的資源操作包括讀取和更新操作,對於不頻繁更新的數據數據多數可以進行緩存。這種換成越靠近客戶端,用戶體驗越好,即提高了整體系統的可用性。
HTTP採取多層緩存機制,系統可以定義自己的緩存策略。(此處是否需要講公共緩存,私有緩存,運行機制?)

2017-12-06-21-30-01

其中代理伺服器和緩存伺服器應該只對公共緩存表述進行緩存,瀏覽器緩存對公共和私有的緩存表述都能進行緩存。通常代理伺服器的緩存行為是用戶所屬組織支持的,不屬於應用系統的行為。

2.3. 資源的自描述

資源的自描述是指:資源的表述裡面應該包括資源當前狀態的描述,以及對該資源或相關資源進一步操作的超鏈接。

2.3.1. 資源的當前狀態

資源的當前狀態由以下幾項共同組成:

  1. 屬於該資源的信息項目的值,比如訂單的編號,創建日期。
  2. 相關資源的鏈接,比如訂單的客戶鏈接以及訂單明細鏈接。
  3. 表示資源將來會遷移到某種可能狀態的鏈接,比如遷移到完成狀態的鏈接:/order/1/completeness POST
  4. 對應該資源與其他資源相關聯的任何業務規則的求值結果,比如訂單統計表:/order/statistics/year/2017 GET

下圖是一個訂單狀態的json表述:

2017-12-06-22-29-15

2.3.2. 操作資源的統一介面

HTTP的初衷是應用層協議,HTTP是REST風格的。HTTP的動作提供了操作字體的統一介面。

動作 介面作用 重覆操作效果
POST 創建資源 不冪等
PUT 整體更新資源 冪等
PATCH 部分更新資源 不冪等
DELETE 刪除資源 冪等
GET 獲取資源 冪等

冪等 表示動作的重覆執行不會再產生副作用(引起資源狀態變化),比如刪除一個資源後再次刪除也不會產生作用,同時系統也不應該返回錯誤信息,而是總是返回成功。

RPC或者SOAP風格的架構下HTTP是作為傳輸協議使用。

2.3.3. 請求的無狀態

REST的無狀態是指客戶端請求伺服器時,應提供足夠的信息以讓伺服器能理解並提供服務。無狀態的好處包括:

  1. 改善可見性(監視系統不必為了確定一個請求的全部性質而去查看請求之外的其他請求)
  2. 改善可靠性(減輕了從局部故障中恢復的任務量)
  3. 改善可伸縮性(服務端不必在多個請求直接保存狀態,從而允許伺服器迅速釋放資源)

缺點:

  1. 由於伺服器不能保持會話狀態數據,則會造成在每一次請求中發送大量重覆的數據,可能會降低網路性能。

下圖是請求有狀態和無狀態的對比例子:

2017-12-10-21-32-05

2.4. HATEOAS

HATEOAS(The Hypermedia As The Engine Of Application Statue),中文意思是“將超媒體作為應用狀態的引擎”,這是REST的最高目標(也叫主要架構約束)。

HATEOAS包括兩個概念:

  1. 應用狀態由應用(系統)中的各資源狀態組成,資源狀態的變化導致應用狀態的變化。
  2. 通過在資源表述中添加狀態遷移的超鏈接引導客戶端改變資源狀態。

比如:銷售訂單在創建後,客戶端通過GET操作獲取一個訂單信息,然後請求“審批訂單”鏈接使訂單變成“已審批“狀態。客戶端再請求”執行訂單“完成訂單。這就是一個簡單工作流程。

2017-12-07-21-38-33

3. REST與分散式事物

分散式系統中事物是一個重要話題,遺憾的是REST作為一種系統風格,並沒有約定對事物管理進行規定。事物是伺服器端的事情,不論採用何種事物處理方式都要避免對客戶使用rest服務的影響。

4. REST的典型應用案例

1. GitHub Developer API

比如API:列出pull的評論

GET /repos/:owner/:repo/pulls/:number/reviews

2017-12-11-22-28-06

官網: https://developer.github.com/v3/pulls/reviews/

2. LinkIn 開發者中心

比如API:獲取當前用戶的信息

GET /v1/people/~?

2017-12-11-22-47-34

官網:https://developer.linkedin.com/zh-cn/docs/rest-api

5. REST vs RPC

REST式的Web服務和RPC式的Web服務在介面定義上的區別是,REST使用HTTP通用方法作為統一介面的標準辭彙,REST式的Web服務所提供的方法信息都在HTTP方法里,而RPC式的web服務所提供的方法信息在SOAP/HTTP信封里(其封裝的格式通常是HTTP或者是SOAP),每個RPC式的web服務都會公佈一套符合自己商業邏輯的方法辭彙。

RPC的典型案例

1. 百度lbs服務API

比如API: 行政區劃區域檢索,之所以是rpc,是由於:

  1. 在參數中指定了資源格式MIME(此例是json),就是說資源表述由百度官方自定義協議解釋。
  2. 返回狀態和錯誤信息封裝在返回結果中,說明對於錯誤處理也由百度官方自定義協議解釋。
  3. 返回結果關心的是滿足當前介面數據,如果想進一步瞭解街道信息,客戶端鬚根據獲取街道信息API定義獲取。

http://api.map.baidu.com/place/v2/search?query=ATM機&tag=銀行&region=北京&output=json&ak=您的ak GET

2017-12-13-21-28-24

如果經過rest風格改造,行政區劃區域檢索API的返回結果可以是如下形式:

2017-12-14-22-15-45

註:百度lbs不是面嚮應用狀態遷移設計,因此採用rpc也是合適的。

2.Saleforce SOAP API

Saleforce提供了SOAP(簡單對象訪問協議) API,SOAP 通過發佈WSDL(網路服務描述語言)文件來描述伺服器提供的API的輸入參數結構和返回數據結構以及可能的異常信息。客戶端通過WSDL生成客戶端調用代碼(SOAP語言無關,可跨開發語言調用),就能調用遠程的服務API。

下圖表示表示了Saleforce的提供的API的WSDL:

2017-12-13-22-21-31

註:Saleforce也提供了REST的API。

以下是二者的主要區別:

REST RPC
HTTP協議地位 應用協議 傳輸協議或者不用
傳輸協議 HTTP HTTP或者TCP
消息序列化類型 MIME MIME或者自定義協議
傳輸性能
服務處理性能
介面特點 通用(HTTP動作) 自定義介面動作
應用協議 HTTP 自定義
應用狀態遷移方式 資源狀態變化 業務數據狀態變化
緩存擴展性 自定義
客戶端耦合力度(協議)
客戶端代碼執行 按需提供(JS,CSS,HTML等) 預設不支持
客戶端的庫支持 不需要 最好有,且和服務同步升級
防火牆穿透力 預設不支持
公網組件支持度 現成支持,包括(反向)代理伺服器,防火牆,緩存伺服器,用戶代理(瀏覽器等) 需自行支持(http傳輸除外)
企業應用標準化程度 低(企業自定義) 中(基於SOAP協議,各廠商產品容易集成)

以下是主流RPC和REST框架

框架 特點 開發語言
Thrift Thrift是一個跨語言的RPC框架,自帶的代碼生成引擎大幅提高了開發效率,從而使它如此流行。
最初由Facebook團隊設計開發,現在已貢獻給Apache
多語言
Dubbo Dubbo是阿裡巴巴開源的專門為Java設計的、成熟的RPC框架。支持基本的服務治理,所有服務治理
功能均在Client端集成:服務發現、負載均衡、容錯、監控等
Java
Spring HATEOAS Spring HATEOAS 可以很方便創建 基於HATEOAS 原則的REST 風格介面 ,
但需要依賴於 Spring 和 Spring MVC
Java

6. 總結

HTTP的本意是方便應用系統實現REST的架構,不過人們在早期並沒有意識到它的優點,因此目前更多使用的是RPC框架,因為REST 對開發人員的能力要求更高。綜上,REST具有以下主要特點:

  1. 以HTTP為應用協議。
  2. 基於WEB中間件進行擴展:緩存代理提高緩存擴展,反向代理提供負載均衡和內外網協議轉化(HTTPS和HTTP之間)。
  3. 請求的無狀態:由於伺服器沒有會話上下文信息,提高系統的可伸縮性。缺點是傳輸冗餘一些。
  4. 多級緩存:客戶端代理,代理伺服器,緩存伺服器提供了強大緩存能力,提高了系統的可用性。
  5. 對資源內容的描述方式,比如MIME協商或者在此基礎上的擴展格式,保證了系統的簡單性和通用性。
  6. 資源狀態變化促成應用狀態遷移(HATEOAS),可使開發者以資源為中心建模,這種設計相對簡單。
  7. 資源表述中鏈接廣告了應用的狀態流,但並不強迫客戶端進行處理,有利於客戶端平滑升級。

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

-Advertisement-
Play Games
更多相關文章
  • 1、數據方法分類: (1)原數組改變 push pop unshift shift reverse sort splice (2)原數組未變,生成新數組 slice concat filter 對於使原數組變化的方法,可以直接更新視圖。 對於原數組未變的方法,可以使用新數組替換原來的數組,以使視圖發 ...
  • 如果直接在綁定的函數中傳入this,則不能正確獲取,且不能獲取到相關的inputfile對象 ...
  • Lazy Load也叫惰性載入,延遲載入,顧名思義,就是在圖片未到達可視區域時,不載入圖片,我們常常在很多的優秀網站上看到類似的例子,例如迅雷、土豆、優酷等,由於一個網頁的圖片非常多,一次性載入增加伺服器壓力,而且用戶未必會拉到底部,浪費用戶流量,Lazy Load採用按需載入,更快的載入速度從而達 ...
  • 【學習實踐用】 後臺:nodejs 前臺:vue2 式樣:uiKit 圖表:echarts 存儲:json文件 打包:webpack 功能:調查問卷的添加,修改,投票以及結果查看 ...
  • 在ios或android如果直接用webview在打開H5鏈接例如: 打開:http://localhost:8080/#/answer?id=1509335039582001 會變成 http://localhost:8080/ 造成根本打開不了想要的頁面(微信中獲取網頁授權的時候有#號也會有問題 ...
  • Js阻塞機制,跟Js引擎的單線程處理方式有關,每個window一個JS線程。所謂單線程,在某個特定的時刻只有特定的代碼能夠被執行,並阻塞其它的代碼。 由於瀏覽器是事件驅動的(Event driven),因此瀏覽器中很多行為是非同步(Asynchronized)的,很容易有事件被同時或者連續觸發。當非同步 ...
  • accept表示打開的系統文件目錄;capture表示的是系統所捕獲的預設設備,camera:照相機;camcorder:攝像機;microphone:照相+攝像。 如果不加上capture,則只會顯示相應的,例如上述三種依次是:拍照或圖庫,錄像或圖庫,錄像或拍照或圖庫,加上capture之後不會調 ...
  • javascrpit面向對象之綜合 這一章是對前幾章的一個總結,通過一個案例來綜合認識javascript面向對象的基本用法 需求: 幾乎所有的web應用都需要保存數據一些到本地,那麼我們就來做一個數據儲存器吧。 詳細需求需求: 當本地儲存有數據時,取用本地的數據,沒有時使用預設的數據 判斷本地的數 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...