到底什麼是 RESTful?

終於瞭解它了。

簡述

RESTful(Representational State Transfer)表現層狀態轉換;它的名字沒有很重要,只是讓你們知道一下而已。

但重要的事情是:

  • 它是一種「風格」,不是「規範」
  • 它是一種「風格」,不是「規範」
  • 它是一種「風格」,不是「規範」

就好像每個人都有自己的 coding style,但總會有幾個比較主流的風格,像是 camelCaseisBoolean 等等這種大家都認同的約定俗成。RESTful 也是一樣,只是他是應用在 API 上面的一種風格。

你可以不照著大家的風格走,但別人就得多花心思看你寫的東西就是了。

RESTful 也就是這樣的概念而已,照著這個風格去設計 API,會讓大家用 API 的時候比較順。說穿了它的本意只是「希望你好好的善用 HTTP 提供的動詞來設計 API」,僅此而已。

如果沒有 RESTful 的話?

沒有 RESTful 的話,一個 API 可能會被設計成這樣子:

non-restful

從這張圖可以先看到一些問題,像是「刪除使用者」跟「更改使用者」怎麼會都是 POST?不是應該要用 DELETEPATCH 嗎?再來,每個功能都得特地建立一個新的網址路徑,是不是有點麻煩?

你可能會想說為什麼可以這樣子寫?但如果你寫過一點點的後端的話(不懂可以參考 這裡),就會知道不管是用哪個 HTTP 方法都不會影響你接下來要做的事情。

原因是這樣子,每個功能都對應到不同的網址,所以只要有人發送 request 到這隻 API,管他要用 POST 還是 GET,後端都可以做相對應的處理。

也許這樣子還是可以實現該有的功能,但終究還是會碰到一些小麻煩:

1. 每個人的命名風格不同

以上面的「新增使用者」來說,A 可能想取 new_user,B 可能想取 creat_user,C 可能想叫
creat_new_user,那最後到底該叫什麼才好?如果沒有一個統一的風格就會變得很麻煩。

2. 每個人的動作不一致

A 可能覺得要存取使用者資料就該用 GET,B 覺得無所謂;或是 A 決覺得刪除使用者資料該用 DELETE,B 覺得 POST 也沒差阿,反正只要發到正確的網址我都還是可以處理阿。

為什麼會有這種問題?因為 HTTP 規定的只是你在「溝通」的時候要遵循 GET POST DELETE 這些格式,但並它沒有規範你在收到訊息後的「實際行為」。

以訂便當的例子來說,如果有個新來的同學不知道「訂便當」要用 POST 代號,所以他寫成GET

1
2
3
4
GET
送達時間:第四堂
雞腿飯 5
雞排飯 2

最後收到這張紙條的人雖然看到上面寫的是 GET,但還是能從內容判斷出這個請求是要「訂便當」,也就是 POST,所以依然可以幫他完成訂便當的動作。

換成 HTTP 也是同樣的概念,你在前端要發 request 一定要遵循 HTTP 的方式來溝通,但後端接到 request 後他「實際要做什麼」,都不在 HTTP 規範的範圍裡。

如果有了 RESTful?

restful

為了解決上面的問題,RESTful 提出一個很簡單的概念:把資源給統一化

仔細想一下,其實不管是新增、刪除、查詢等等的動作,我們都是在對 users 這個資源做事情,那為什麼不乾脆就統整成 users,再搭配 HTTP 提供的那些動作來做區分就好?

以上面例子來說,要讓 /users 這個網址同時處理「新增」跟「刪除」這兩個動作,你只要發送一個 POSTGET 的請求我就能看出來你想做的是什麼,所以就不必在分成 /new_user/creat_user 了。

總而言之,RESTful 只是一個「風格」,不是「規範」,你不想使用也沒關係。這就跟在寫 HTML 的時候很像,HTML 沒有規定你一定要用 <article><section> 那些語意標籤。你可以都不要用那些標籤,一路 <div><span> 到底。

這會怎麼樣嗎?不會,只是沒有這麼一目了然而已。

mentor-program-day24 你不知道的 hosts 設定檔
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×