※ 路由語義化:RESTful 風格應用
什麼是 RESTful:
運用 HTTP 來表達語義的路由設計風格稱為 RESTful API。所謂的 API 是應用程式介面 (application programming interface),網址也是一種應用程式的「介面」,故稱為 API。
RESTful 風格的網址設計強調從路由結構就能看出要對什麼資料、進行什麼操作。舉例來說,如果資料是 todos,那麼 RESTful 風格的 CRUD 路由就會這樣寫:

todos,這邊習慣用複數名詞。然後固定結構是:- 瀏覽全部資料:GET + 資源名稱
- 瀏覽特定資料:GET + 資源名稱 + :id
- 新增一筆資料:POST + 資源名稱
- 修改特定資料:PUT + 資源名稱 + :id
- 刪除特定資料:DELETE + 資源名稱 + :id
總之,如果需要處理特定資料,就需要加上 :id,其他情況都用 HTTP 動詞來做變化。從網址上的複數名詞可以看出操作的對象,這就是 RESTful 的精神。
下圖對照了「完全採用 RESTful 風格」 和實際的路由規劃做對照,用 * 標記出了不同的地方。

- new 頁面和 edit 頁面:這兩條路由並不是「對 todos 進行資料操作」,但也是很常出現的頁面。因為本質仍然是瀏覽,所以動詞用 GET,另外在 URL 加上
new和edit來表達功能屬性。 - 首頁 v.s. 瀏覽全部路由:在這裡我們選擇著重了首頁的語義,因此只配置路由
GET /,而沒有配置GET /todos。
※ Method-override介紹:
method-override 是一個 Express 的 middleware,也就是「中介軟體」。關於 middleware 現在先簡單理解重點:

- 從 request 進來到 response 回去會經過一系列的流程
- 這個流程會按照路由清單由上而下執行
- 可以用
app.use來對所有的 request 進行前置處理 - 只要是會發生在這個 request-response 流程裡的程序,都叫做 middleware
我們用 app.use 來掛載 method-override,意思是我們要對所有的 request 進行前置處理,處理好了以後,才讓 request 繼續往下進入特定路由。
設定參數:_method
設定時我們傳入了一個參數 _method,這個是 method-override 幫我們設計的路由覆蓋機制,只要我們在網址上使用 query string (也就是 ?) 帶入這組指定字串,就可以把路由覆蓋掉:

經過 method-override 處理後,這筆 request 就可以成功導入由 app.put 或 app.delete 設定的路由函式。
為什麼需要 method-override?
在 RESTful 架構中,我們常用:
GET:讀取資料POST:新增資料PUT:更新資料DELETE:刪除資料
但 HTML 表單只能送出 GET 或 POST,不能直接送出 PUT 或 DELETE。這時就需要 method-override 來「偽裝」成其他方法。










