天天看點

一篇文章帶你搞懂什麼是 REST 風格 URL

文章目錄

    • 一、為什麼要要引入 RESTful ?
    • 二、什麼是 rest?
    • 三、rest 的特點
    • 四、誤區

一、為什麼要要引入 RESTful ?

因為在移動網際網路真正到來之前,網頁是前端後端融在一起的,比如之前的PHP,JSP等。

在之前的PC時代問題不大,但是近年來移動網際網路的發展,各種類型的Client層出不窮,

RESTful可以通過一套統一的接口為 Web,iOS和Android提供服務。另外對于廣大平台來說,比如Facebook platform,微網誌開放平台,微信公共平台等,它們不需要有顯式的前端,隻需要一套提供服務的接口,于是RESTful更是它們最好的選擇。

一篇文章帶你搞懂什麼是 REST 風格 URL

二、什麼是 rest?

REST(英文: Representational State Transfer,簡稱 REST)描述了一個架構樣式的網絡系統,

比如 web 應用程式。它首次出現在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規範的主要編寫者之一。在目前主流的三種 Web 服務互動方案中, REST 相比于 SOAP(Simple Object Access protocol,簡單對象通路協定)以及 XML-RPC 更加簡單明了,無論是對 URL 的處理還是對 Payload 的編碼, REST 都傾向于用更加簡單輕量的方法設計和實作。

REST 并沒有一個明确的标準,而更像是一種設計的風格。它本身并沒有什麼實用性,其核心價值在于如何設計出符合 REST 風格的網絡接口.

restful 認為一切皆是資源, API 應該是對資源的狀态的轉化

具體來說就是:

  • 每一個URI都代表一種資源
  • 用戶端和服務端之間,是傳遞這種資源的表現層
  • 用戶端通過四個 HTTP 動詞,對伺服器端資源進行操作,實作表現層的狀态轉化

三、rest 的特點

(1)restful 的優點:它結構清晰、符合标準、易于了解、 擴充友善,是以正得到越來越多網站的采用。

(2)restful 的特性:

(1)資源(Resources) : 網絡上的一個實體,或者說是網絡上的一個具體資訊。它可以是一段文本、一張圖檔、一首歌曲、一種服務,總之就是一個具體的存在。

可以用一個 URI(統一資源定位符)指向它,每種資源對應一個特定的 URI 。要擷取這個資源,通路它的 URI 就可以,是以 URI 即為每一個資源的獨一無二的識别符

(2)表現層(Representation) : 把資源具體呈現出來的形式,叫做它的表現層,比如,文本可以用 txt 格式表現,也可以用 HTML 格式、 XML 格式、 JSON 格式表現,甚至可以采用二進制格式。

URI隻代表資源的實體,不代表它的形式。嚴格地說,有些網址最後的".html"字尾名是不必要的,因為這個字尾名表示格式,屬于"表現層"範疇,而URI應該隻代表"資源"的位置。它的具體表現形式,應該在HTTP請求的頭資訊中用Accept和Content-Type字段指定,這兩個字段才是對"表現層"的描述

也可以稱為消息的自描述行,資源的自描述性

(3)狀态轉化(State Transfer) : 每發出一個請求,就代表了用戶端和伺服器的一次互動過程。 HTTP協定,是一個無狀态協定,即所有的狀态都儲存在伺服器端。

是以,如果用戶端想要操作伺服器, 必須通過某種手段, 讓伺服器端發生“ 狀态轉化”。而這種轉化是建立在表現層之上的,是以 就是 “ 表現層狀态轉化” 。

用戶端用到的手段,隻能是HTTP協定,具體說就是 HTTP協定裡面,四個表示操作方式的動詞: GET 、 POST 、 PUT、 DELETE。

它們分别對應四種基本操作: GET 用來擷取資源,POST 用來建立資源, PUT 用來更新資源, DELETE 用來 删除資源。

具有這些特性的主要目的就是實作用戶端無需借助任何文檔既能調用所有的伺服器資源

四、誤區

(1)因為"資源"表示一種實體,是以應該是名詞,URI不應該有動詞,動詞應該放在HTTP協定中。

舉例來說,某個URI是/posts/show/1,其中show是動詞,這個URI就設計錯了,正确的寫法應該是/posts/1,然後用GET方法表示show。

如果某些動作是HTTP動詞表示不了的,你就應該把動作做成一種資源。比如網上彙款,從賬戶1向賬戶2彙款500元,錯誤的URI是:

正确的寫法是把動詞transfer改成名詞transaction,資源不能是動詞,但是可以是一種服務:

(2)URI中加入版本号

http://www.example.com/app/1.0/foo

http://www.example.com/app/1.1/foo

http://www.example.com/app/2.0/foo
           

因為不同的版本,可以了解成同一種資源的不同表現形式,是以應該采用同一個URI。版本号可以在HTTP請求頭資訊的Accept字段中進行區分:

Accept: vnd.example-com.foo+json; version=1.0

Accept: vnd.example-com.foo+json; version=1.1

Accept: vnd.example-com.foo+json; version=2.0
           

【參考】

【1】https://www.jianshu.com/p/0e0ed296d2a3

【2】https://www.cnblogs.com/wang-yaz/p/9237981.html

【3】http://www.ruanyifeng.com/blog/2011/09/restful.html

【4】https://www.cnblogs.com/xuxiuxiu/p/7736801.html