J.J. Huang   2020-03-03   Tech.   瀏覽次數:次  

技術觀念 | 淺談分散式系統 - 深入理解 REST

REST 是 Web Service 的一種實踐方式,是一種 Web Service 架構風格。它與SOAP 不同,儘管SOAP 也常被用於構建Web Service,但SOAP 本身與傳輸協議無關,可以是HTTP(web service),也可以是SMTP,TCP 甚至FTP,這種獨立性必然會帶來設計的複雜性,降低它的可用性和易用性。

與 SOAP-based Web Service 不同,REST 是一種架構風格,不是標準協議。在實現RESTful 風格的API 時會用到HTTP,URI,JSON,和XML 等其它web 標準,REST 只提供架構的理念和約定(Architectural constraints),有時候儘管有些Web Service 並沒有完全遵從REST 的架構約束,也同樣會被稱為RESTful API。

REST(2000s) 就是為 Web Service 而生的,簡潔、易用、易擴展!​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

REST 到底什麼呢?

REST Representational State Transfer (REST),這個術語在字面上不直觀,不好理解,什麼是 Representational,表徵的誰? State 是誰的 State?

先說 Representation,可以解釋為表徵,象徵,代理,通俗的說就是符號,不是本體。這背後是一個很深刻的哲學問題,有興趣的同學可以看一下《皮爾斯:論符號》。人類生活在一個表徵的世界,概念的世界,符號的世界,我們口中的月亮、玉盤、太陰、Moon,都與那個圍繞著地球旋轉的星球有關,但指向月亮的手不是月亮,它們僅僅是指代那個星體的符號!但是在現實生活中,在各種各樣的社會活動中,我們需要的恰恰是 Representation,而不是 Objectivity!比如,一個人去銀行申請抵押貸款,業務員需要他提供資產證明(Representation),而不是資產實物。

如想更了解可以參考技術觀念 | REST & RESTful 是什麼?​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

技術觀念 - 圖 1 (01)

同樣的道理,在web 事務/服務中,用戶並不關心資源實體是什麼,它可能是xml 文件,也可能是資料表,可能是字符串,也可能是二進制,這都不重要,因為用戶只關心它的Representation,它的表徵物。在 REST 中,資源實體被最終表徵為 json/xml 或者字符串!用戶通過 RESTful 請求以 transfer state 的形式表徵資源實體的增刪改查!

技術觀念 - 圖 2 (02)​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

“Web resources” 起初是用來指代web 中的文檔/文件(HTML,js,css,image),現在它的涵義變得更加廣泛和抽象,任何可以被請求的內容實體(如,字符串, XML,JSON…)都可以稱之為Web 資源。

Clean URLS 簡單接口的設計

Clean URLs, also sometimes referred to as RESTful URLs, user-friendly URLs, or search engine-friendly URLs, are Uniform Resource Locators (URLs) intended to improve the usability and accessibility of a website or web service by being immediately and intuitively meaningful to non-expert users.

提高 web 接口的可用性、易用性、易理解性,URL 在概念上要簡單、直接,結構上更能反映訊息的資料結構,而不是訊息在服務器中的存儲結構。​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

SEO:search engine optimization。

URL 通常包括資源路徑、名稱和訪問參數,訪問參數中常常會包含一些含糊的、無關的元訊息,比如:

1
http://example.com/personal?country=taiwan&province=taipei&name=morose&id=666

訪問參數中訊息是隔離的、含糊的,甚至是冗餘的。
如果修改為:​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

1
http://example.com/personal/taiwan/taipei/morose/666

就會顯得簡潔、清晰多了。

Uncleaned URL Clean URL
http://example.com/index.php?page=name http://example.com/name
http://example.com/about.html http://example.com/about
http://example.com/index.php?page=consulting/marketing http://example.com/consulting/marketing
http://example.com/products?category=12&pid=25 http://example.com/products/12/25
http://example.com/cgi-bin/feed.cgi?feed=news&frm=rss http://example.com/news.rss
http://example.com/services/index.jsp?category=legal&id=patents http://example.com/services/legal/patents
http://example.com/kb/index.php?cat=8&id=41 http://example.com/kb/8/41
http://example.com/index.php?mod=profiles&id=193 http://example.com/profiles/193
http://en.wikipedia.org/w/index.php?title=Clean_URL http://en.wikipedia.org/wiki/Clean_URL

實現:

  • 通過模式匹配進行 URL 映射(mapping)
  • URL 重寫(rewriting)

什麼是 WOA?

建議先看此篇文章了解什麼是SOA,技術觀念 | 淺談分散式系統 - 服務的本質與 SOA​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

  • WOA:Web-oriented architecture
  • SOA:Service-oriented architecture

面向Web架構(Web Oriented Architecture),面向服務架構(SOA)的延伸。
WOA 是從 SOA 衍生出來的概念,可以簡單地理解為基於 Web 的 SOA。

「WOA = SOA + WWW + REST」

The WOA Stack:​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

  • Distribution (HTTP,feeds)
  • Composition(Hypermediea, Mashups)
  • Security(OpenID,SSL)
  • Data Portability(XML,RDF)
  • Data Representation(ATOM,JSON)
  • Transfer Methods(REST,HTTP,BitTorrent)

最佳實踐

RESTful API 設計最佳實踐可參考:
Vinay Sahni:Best Practices for Designing a Pragmatic RESTful API

  1. 版本(Versioning):應該將API的版本號放入URL,https://api.example.com/v1/。另一種做法是,將版本號放在HTTP頭訊息中,但不如放入URL方便和直觀。 Github採用這種做法。
  2. 路徑(Endpoint): 表示API的具體網址。
  3. HTTP 動詞: GET、POST、PUT、PATCH、DELETE
  4. 過濾訊息(Filtering)
    • ?limit=10:指定返回記錄的數量
    • ?offset=10:指定返回記錄的開始位置。
    • ?page=2&per_page=100:指定第幾頁,以及每頁的記錄數。
    • ?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序。
    • ?animal_type_id=1:指定篩選條件
  5. 狀態碼(Status Codes)
  6. 錯誤處理(Error handling)
  7. 返回結果
  8. Hypermedia API:Hypermedia as the engine of application state (HATEOAS)
  9. 其他:認證 OAuth 2.0

技術觀念 - 圖 3 (03)

技術觀念 - 圖 4 (04)​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌‌​​​‌‌​‌‌‌‌​‌‌​​‌‌‌​‌‌‌‌​​‌​​‌​‌‌​‌​​‌‌​​‌​​​‌‌​​​​​​‌‌​​‌​​​‌‌​​​​​​‌‌​​​​​​‌‌​​‌‌​​‌‌​​​​​​‌‌​​‌‌​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌​‌​​​​​‌​‌‌​‌​​‌‌‌​​‌

技術觀念 - 圖 5 (05)


註:以上參考了
漫谈分布式系统中的技术 —— 从 IPC/RPC,SOA,Web Service/REST 到 micro services(微服务)
RESTful API设计 最佳实践。