1. 程式人生 > >RESTfull 介面規範理解

RESTfull 介面規範理解

RESTfull介面規範理解

RESTfull = Representational State Transfer 即表現層狀態轉移 加 ful (即形容詞字尾) 則表示是形容詞性的

而要理解RESTful架構,最好的方法就是去理解Representational State Transfer這個片語,直譯過來就是「表現層狀態轉化」,其實它省略了主語。「表現層」其實指的是「資源」的「表現層」,所以通俗來講就是:資源在網路中以某種表現形式進行狀態轉移。分解開來:

  • Resource:資源,即資料。比如usenames/users/friends/menu/order等;
  • Representational:某種表現形式,比如用JSON,XML,JPEG等;
  • State Transfer:狀態變化。通過HTTP動詞實現。

然後再來理解一個具體的RESTful架構——面向資源的架構(Resource-Oriented Architecture,ROA):

  • 資源是由URI來指定。所謂「上網」,就是與網際網路上一系列的「資源」互動,呼叫它的URI。
  • 對資源的操作包括獲取、建立、修改和刪除資源,這些操作正好對應HTTP協議提供的
  • get(獲取網路中某個地址的資源),
    • post(建立資源也叫更新資源),
    • put(更新資源),
    • patch(更新網路資源),
    • delete(刪除網路資源)
    • 最常見的就是get和post請求
    • 通過操作資源的表現形式來操作資源。具體表現形式,應該在HTTP請求的頭資訊中用Accept和Content-Type欄位指定。
  • 資源的表現形式則是XML或者HTML,取決於讀者是機器還是人,是消費web服務的客戶軟體還是web瀏覽器。當然也可以是任何其他的格式。

應用於Web服務,符合REST設計風格的Web API稱為RESTful API。它從以下三個方面資源進行定義:

  • 直觀簡短的資源地址:URI,比如:http://example.com/resources/;每一個URI代表一種資源;
  • 傳輸的資源:Web服務接受與返回的網際網路媒體型別,比如:JSON,XML,YAML等。
  • 對資源的操作:Web服務在該資源上所支援的一系列請求方法(比如:POST,GET,PUT或DELETE)。

HTTP請求方法在RESTful API中的典型應用:

資源GETPUTPOSTDELETE
一組資源的URI,比如http://example.com/resources/列出URI,以及該資源組中每個資源的詳細資訊(後者可選)。使用給定的一組資源替換當前整組資源。在本組資源中建立/追加一個新的資源。該操作往往返回新資源的URL。刪除整組資源。
單個資源的URI,比如http://example.com/resources/142獲取指定的資源的詳細資訊,格式可以自選一個合適的網路媒體型別(比如:XML、JSON等)替換/建立指定的資源。並將其追加到相應的資源組中。把指定的資源當做一個資源組,並在其下建立/追加一個新的元素,使其隸屬於當前資源。刪除指定的元素。

REST的誤解

現在看來,REST在2000年那個時代,確實是超前於時代的。Web開發者社群對於HTTP的設計意圖存在著大量的誤解,由此導致了對於HTTP的大量低效率的誤用。這個情況持續一直到2005年Web 2.0的崛起。那個時候,DCOM、EJB、SOAP/WSDL這些DO風格的架構由於難以滿足網際網路環境對分散式應用架構設計的約束,與Web自身的架構風格REST相沖突,很難融入到Web之中。所謂的「Web Services」,其實除了將HTTP作為底層的傳輸協議外,跟(網際網路環境中的)真正的Web沒有什麼關係。

而隨著Ruby on Rails這個著名的Web開發框架開始大力支援REST開發之後,一線的Web開發者才真正接觸到了REST。然而Rails所支援的REST開發將對資源的操作侷限於CRUD(建立、獲取、修改、刪除)的語義(即,將對資源的CRUD操作對映到 GET/POST/PUT/DELETE四個HTTP方法),這其實是收窄了REST的適用範圍。其他程式語言的Web開發框架(例如Java語言的 Struts、Spring MVC等等)也緊接著模仿了Rails的方式開始支援REST開發,然而這更加導致了一線的Web開發者誤以為:REST開發就是 通過GET/POST/PUT/DELETE四個HTTP方法對資源執行CRUD操作。甚至還有很多僅僅使用了HTTP,而沒有使用SOAP的Web服 務API,都自稱是REST風格(RESTful)的API。

對於什麼才是真正的REST風格的誤解是如此之多,而將REST作為一個便於營銷的 buzzword的掛羊頭賣狗肉者也是如此之多,以至於REST的創造者Fielding終於忍無可忍了。2008年10月Fielding寫了一篇博 客,做出了一個非常明確的斷言:REST APIs must be hypertext-driven!(REST API必須是超文字驅動的!)超文字驅動這個理念變成了一個縮寫詞HATEOAS,這個縮寫詞來自於當初Fielding博士論文中的一句話: hypermedia as the engine of application state(將超媒體作為應用狀態的引擎)。其實超文字驅動(Hypertext Driven)的理念才是REST架構風格最核心的理念,也是REST風格的架構達到鬆耦合目標的根本原因。

REST設計進階

當談及REST成熟度時,一些人常常會引用Richardson所提出來的REST成熟度模型(Maturity Model),並視之為正確的度量方法。

1.在架構中引入資源(Resource)的概念。

大多數WS-*服務和POX都只是使用一個URI作為一個服務埠,也只使用一個HTTP方法傳輸資料。這種做法相當於把HTTP這個應用層協議降級為傳輸層協議用,《REST實戰》也一再強調HTTP是一種應用協議而不是傳輸協議。再好一點就是使用多個URI,然而不同的URI只是作為不同的呼叫入口,與此同時只使用同一個HTTP方法傳輸資料。最常見的錯誤就是在URI中包含動詞,比如URI http://example.com/getOrder?orderId=1234,其實「資源」表示一種實體,所以應該是名詞,動詞應該放在HTTP協議中。而與此同時URI也有可能破壞HTTP GET的安全性和幕等性,比如某個客戶端在http://example.com/updateOrder?id=1234&coffee=latte上執行GET(而不是POST),就能建立一筆新的咖啡訂單(一個資源),按理來說GET請求不能改變服務的任何狀態。

2.每一個URI代表一種資源,支援HTTP動詞(即get,post,put,delete)。

此時使用多個URI的話,需要讓不同的URI代表不同的資源(注意多個URI可能指向同一個Resource,而一個URI不能指向不同Resource。),同時使用多個HTTP方法操作這些資源,例如使用POST/GET/PUT/DELET分別進行CRUD操作。這時候HTTP頭和有效載荷都包含業務邏輯,例如HTTP方法對應CRUD操作,HTTP狀態碼對應操作結果的狀態。我們現在看到的大多數所謂RESTful API做到的也就是這個級別。《REST實戰》的譯者也談到:悟性差的人,理解到CRUD式Web服務就滿足了。而悟性好的人,可以徹底理解超文字驅動,甚至是與REST關係密切的語義網,最終達到 REST開發的最高境界。


相關推薦

RESTfull 介面規範理解

RESTfull介面規範理解RESTfull = Representational State Transfer 即表現層狀態轉移 加 ful (即形容詞字尾) 則表示是形容詞性的而要理解RESTful架構,最好的方法就是去理解Representational State T

Map介面理解和使用

轉自:https://www.cnblogs.com/jpwz/p/5680494.html Java集合中Map介面的使用方法 Map介面 Map提供了一種對映關係,其中的元素是以鍵值對(key-value)的形式儲存的,能夠實現根據key快速查詢value; Map中的鍵

rest api介面規範

1.設計規範   1.協議:使用HTTPs協議 確保互動資料的傳輸安全   2.域名:儘量將api部署在專用域名下https://api.example.com   3.版本控制:將版本號放在url中或者header中 v1,v2,vn   4.路徑:只能包含名詞,   5.過濾資訊:?limit=

CHENGDU3-Restful API 介面規範、django-rest-framework框架

  Restful API 介面規範、django-rest-framework框架 問題:什麼是API? 答:API是介面,提供url. 介面有兩個用途: 為別人提供服務,前後端分離。 為什麼使用前後端分離? 答:主要為了資料的解耦,提高開發效率。 如果更新了資料,

RESTful介面規範之GET/POST/PUT/DELETE

REST 是Representational State Transfer的縮寫,翻譯是”表現層狀態轉化”. 面向資源是REST最明顯的特徵,對於同一個資源的一組不同的操作。資源是伺服器 上一個可命名的抽象概念,資源是以名詞為核心來組織的,首先關注的是名詞。REST要求,必須通過統一的介

接第三方介面理解到的“閘道器”概念

閘道器?路由?   怎麼感覺是網管幹的活啊。   生活當中莫名的熟悉了路由這個概念,應該是和我朋友閒聊得到的吧,他在電信上過班,還是很崇拜的當時,大概是一氣化三清,就是岔路口分流器的概念。   閘道器這個概念應該是在學linux作業系統的時候,韓順平的視訊裡面提到的,就是說網際網路是一個大的區域網,我們

API介面規範(試行版)

1.協議 API與使用者的通訊協議,總是使用HTTPS協議,確保互動資料的傳輸安全。 2.安全 為了保證介面接收到的資料不是被篡改以及防止資訊洩露造成損失,對敏感資料進行加密及簽名。 資料加密 api介面請求引數一律採用RSA進行加解密,在客戶端使用公鑰對請求引數進行加密,在服務端使用對數私鑰據進行解密

前後分離介面規範

1. 前言 隨著網際網路的高速發展,前端頁面的展示、互動體驗越來越靈活、炫麗,響應體驗也要求越來越高,後端服務的高併發、高可用、高效能、高擴充套件等特性的要求也愈加苛刻,從而導致前後端研發各自專注於自己擅長的領域深耕細作。 然而帶來的另一個問題:前後端的對接介面雙方卻關注

介面規範和測試Checklist

介面規範和測試Checklist Document number 文件編號 Confidentiality level 密級 內部公開 Document version 文件版本

TMS320C6678中Hyperlink介面理解

一、hyperlink的使用 1.overview     1.DSP之間用於高速,低延遲,少管腳的通訊介面,可以模擬多種當前使用的外設介面。     2.hyperlink包括數字訊號和邊頻帶控制訊號。數字訊號是基於serdes的,邊頻帶訊號是基於LVCMOS的。當前

Java 介面規範與最佳實踐

可理解 文件完善 格式統一:這裡涉及很多方面,包括:介面返回型別、命名規則以及引數順序 在我們所有的API方法中,要麼是全是getXYZ()格式,要麼全是xyz(),最好不要兩種格式都有。

Java抽象類、介面理解及default關鍵字

抽象類 可看做是不可例項化的普通類,可以擁有構造方法,可以有main方法 抽象類中的方法可以是抽象方法(抽象方法必須存在於抽象類中),也可以是普通方法、靜態方法 可以宣告變數 抽象類可以繼承其

RESTful 介面規範

最近,我正在使用RESTfull的方式構建一個web服務。儘管現在有很多的一般的指導和提示告訴你如何定義restful介面,但是卻沒有一個明確的標準或大家都接受的schema定義去遵循。 在網上獲取了一些資訊後,我打算打破這一局面:)我打算

Java本機介面規範內容 第5章:呼叫API

Invocation API允許軟體供應商將Java VM載入到任意本機應用程式中。 供應商可以提供支援Java的應用程式,而無需連結Java VM原始碼。 本章首先概述了Invocation API。 接下來是所有Invocation API函式的參考頁面。 它涵蓋以下主

RESTful api介面規範

整體規範建議採用RESTful 方式來實施。 協議 API與使用者的通訊協議,總是使用HTTPs協議,確保互動資料的傳輸安全。 域名 應該儘量將API部署在專用域名之下。 https://api.example.com 如果確定API很簡單,不會有進一步擴充套件,可以考

介面規範文件總結、介面管理工具推薦、如何寫出完美的介面

寫在前面:這是我最近整理的介面規範文件,無規矩不成方圓,為了app開發人員與後臺介面開發人員更好的配合,我特意整理了這麼一篇文件供大家參考學習,如有意見請在評論區留言謝謝。因部分內容涉及公司程式碼,我對本文件略有刪減。介面規範說起來大,其實也就那麼幾個部分,介面規範、介面管理工具、介面文件編寫、開發文件編寫。

繼承介面與實現介面理解

        在我學習的過程中發現對兩個相似的概念很難理解,就是實現介面和繼承介面,我在網上也查了查答案,發現不是我想要的回答。我就是想弄清楚一個類實現一個介面和繼承一個介面有什麼區別,因為我發現就沒有區別,繼承和實現了之後都得重寫所有的抽象方法。         現在,

nodeJs中的CommonJs 規範理解

node中使用commonJs規範實現模組記載機制,在這個規範下每個.js檔案都是一個模組,他們內部各自使用的變數名函式名互不衝突。 一個模組要想對外暴露變數(函式也是變數),可以用module.exports = variable;,一個模組要想引用其他模組暴露的變數,用

API介面規範

協議API與使用者的通訊協議,使用HTTP協議。版本應該將API的版本號放入URL: https://neusoft.com/api/v1/ 路徑每一個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞。API中的名詞對應集合的情況,需要使用複數。H

系統API介面規範

僅備忘: 1. 第一章 概述 隨著網際網路的發展,網站應用的規模不斷擴大,常規的垂直應用架構已無法應對,分散式服務架構勢在必行。 u 單一應用架構 Ø 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。 u 垂直應用架構 Ø 當訪問量逐漸增大