# 什麼是RESTFUL API REST 是 Representational State Transfer 的縮寫,可譯為「具象狀態傳輸」。 REST 是一種軟體架構風格(並非標準),目的是幫助在世界各地不同軟體、程式在網際網路中能夠互相傳遞訊息。 * GET 讀取資源 * PUT 替換資源 * PATCH 更換資源部分內容 * DELETE 刪除資源 * OPTIONS 回傳該資源所支援的所有 HTTP 請求方法 * CONNECT 將連線請求轉換至 TCP/IP 隧道 * POST 新增資源 ### Router, Routing, Route 在談網路基礎建設時,路由器 (router) 是某種實體設備,負責幫每個資料封包 (packet) 選擇傳輸路徑,扮演類似交通指揮的角色。而「路由器幫資料封包們選擇路徑,引導資料按指定路徑移動」的這個過程,被稱為「routing」。 ### Web 開發裡的路由 轉移到 web app 網路應用程式開發的領域,**路由不再是實體設備,而是指 ```URL 的處理程序```**。這組處理程序會把 HTTP 動詞、URL、和相關的程式碼連接起來。 **我們會在路由系統裡,定義「收到什麼 HTTP request,就執行什麼動作」。** 舉例來說,如果今天收到一支 HTTP request,格式為 GET http://www.example.com/todos ,路由系統會調度出對應的資源,也就是和「瀏覽全部待辦事項」相關的樣板、邏輯、資料等等。 因為有了路由系統,網站對外開放的網址,不需要對應到實際的專案目錄。 ### 如何設計路由? ![](https://i.imgur.com/YvqynbH.png) 對資料的操作,不外乎:新增 (create)、讀取 (read)、更新 (update)、刪除 (delete) 四種動作,通常會簡稱為 CRUD。 而 HTTP method 是有意義的動詞,如 GET、POST、PATCH、DELETE 等,因此 RESTful 的表意設計運用動詞的組合,來表達出對資源的操作方式。 # 路由語義化:RESTful 風格應用 ### 什麼是 RESTful 運用 HTTP 來表達語義的路由設計風格稱為 RESTful API。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為 API。 RESTful 風格的網址設計強調從路由結構就能看出要對什麼資料、進行什麼操作。舉例來說,如果資料是 todos,那麼 RESTful 風格的 CRUD 路由就會這樣寫: ![](https://i.imgur.com/V60RzKP.png) 使用 RESTful 風格設計的 API,就有了以下幾種優點及限制: 1. 有唯一的URL表示資源位置,統一的 API 接口。(Uniform Interface) 2. 無狀態。(Stateless) RESTful 的狀態,意即 HTTP 的請求狀態,一般 Web 服務中,Server 端和 Client 端交互的資訊,會存在 Server 端的 Session (例如:已登入狀態),在 Client 端再次發送請求的時候,Server 端透過保存在 Server 端的 Session,去執行 request。無狀態的意思,即 Client 端自行保存狀態,在請求 Server 的時候,一併附上給 Server 端,Server 端無保存 Client 端的狀態資訊。 舉例來說,可能在用戶登錄系統時,Server 產生 token 紀錄 user 已登錄系統,然後把 token 還給 Client,在 Client 再次發送請求的時候,把 token 一起發給 Server,這樣 Server 就知道這一個 Client 是已經處於登錄的狀態。 意即所有的資源都可以 URI 定位,而且這個定位與其他資源無關,也不會因為其他資源的變化而變化,資源相互的依賴性降低。 舉一個白話一點的例子:查詢員工工資: 第一步:登錄系統。 第二步:進入查詢工資的頁面。 第三步:搜索該員工。 第四步:點擊姓名查看工資。 這樣的操作流程就是有狀態的,查詢工資的每一個步驟都依賴於前一個步驟,只要前置操作不成功,後續操作就無法執行。如果輸入一個URL就可以直接得到指定員工的工資,這種情況就是無狀態的,因為獲取工資不依賴於其他資源或狀態,這種情況下,員工工資是一個資源,由一個 URL 與之對應可以通過 HTTP 中的 GET 方法得到資源,這就是典型的 RESTful 風格。 RESTful 的優點如下所列: 1. 瀏覽器即可以作為 client 端 2. 可以更高效地利用 cache 來達到更快的回應速度 > 在 server-side,GET 過的資源,如果沒有被變更過,可以利用 cache 機制減少 request。 > 在 client-side,透過 client 端 cache 紀錄 chahe 版本,若向 server 要求資源時發現 server 最新版與 cache 相同,則 client 端直接取用本地資源即可,不需要再做一次查詢 3. 界面與資料分離 4. 節省伺服器的計算資源 5. 可重用! web/android/ios 都可以用, 無痛轉換! **RESTful API 主要由三種元件組成:** ![](https://i.imgur.com/XWpXeZ1.png) 1. Nouns 名詞:定義資源位置的 URL,每個資源在網路上都會有唯一的位置,就如每戶人家都有唯一的地址一樣。 2. Verbs 動詞:對資源要做的動作。 3. Content Types 資源呈現方式:API 資源可以以多種方式表現,最常用的是 JSON,較輕,也較好處理。 一般的 API,可能會是這樣: ``` 獲得資料GET /getData 新增資料POST /createData 刪除資料DELETE /deleteData/1 ``` 若以 RESTful API 風格開發的話: ``` 獲得資料GET /data 新增資料POST /data 刪除資料DELETE /data/1 ```