iT邦幫忙

2022 iThome 鐵人賽

DAY 15
1
Modern Web

一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列系列 第 15

Day 15 - 進入Rails世界必須懂:REST 和 Restful

  • 分享至 

  • xImage
  •  

關於這兩個名詞的好奇,其實是因為接觸 ruby on rails 的學習歷程中,查詢相關的職缺資訊後,發現許多公司的需求不斷提到這兩個字,因此想要去了解這是在說甚麼,才知道原來 ROR 把這樣的設計風格大大發揚光大呢! 不過都學了 Rails 還不好好把這些名詞弄懂真的太對不起了。

REST?

Representational State Transfer,簡稱 REST,直譯為"表徵化狀態轉變",但一聽到這樣的名詞其實根本搞不懂這到底在說甚麼。
其實 REST 是一種軟體架構風格 ,適合應用在複雜的網路服務環境中,而 HTTP 也是符合 REST 的架構的一項實作。**就是把每個網址(URL)當做資源(Resource)來看待,對同一個資源做不同的動作(HTTP Verb)會得到不同的結果。
**

RESTful?

一開始看到會直覺想到 beautiful, successful 之類的單字都是用名詞 + "ful" 轉變來,所以 RESTful 可算是形容詞,一般來說就是符合 REST 理念所設計出來的系統可稱為 RESTful,像是符合 REST 概念設計的網址,又稱為 RESTFul Route。

RESTful-Triangle (REST 金三角) 概念:

EX:以我們平常上網的例子來說明應該比較好了解這些組成之間的關係

  • 瀏覽器上輸入 https://oseanchen.github.io/(名詞),對瀏覽器送出請求 Request
  • 瀏覽器告訴網頁伺服器:請給我讀取(GET 動詞)這個網址位置的 HTML 格式文件(表徵)
  • 接著瀏覽器解析並呈現出 HTML (回應 Response),看到畫面(Render)
  • 過程中可能讀取網頁中的圖片(表徵),或者點選連結獲得 XML 文件(XML 表徵),甚至新增文章或留言(POST 動詞)

Restful Routes

利用Restful的設計風格,可以讓人很一目瞭然的知道目前的位置是要做甚麼的,為什麼會這麼說? 舉一些例子來讓大家看看吧!

假設我們要建立我自己的部落個並且設計跟文章 Article 相關的路徑 (用articles當作資源)

Sean_blog/articles => 觀看所有文章的列表
Sean_blog/articles/new => 新增文章的頁面
Sean_blog/articles/:id => 觀看特定文章的頁面
Sean_blog/articles/:id/edit => 編輯特定文章的頁面

是不是很能馬上了解到路徑所代表的意義呢? 同樣把articles 資源可以替換成別的資源就換變成其他意義,像是可以換成會員 (member) 或是商品 (product) 等等

也可以設計跨多種資源同樣可以清楚表達,例如

Sean_blog/articles/1/comment 第一篇文章的留言版
Sean_blog/category/5/articles/3 部落格文章分類區域的第5個類別內的第3篇文章

總結

REST 操作 Web 的基本行為是一種表徵化狀態轉變,主要是對不同的資源 (URL) 進行特定動作,達成不同的資料 (表徵) 呈現結果。

對資源進行的動詞可以分成:

  • Get 方法表示向指定的資源要求讀取資料
  • POST 方法表示向指定的資源新增資料
  • PUT 或 PATCH 方法表示向指定的資源更新資料 (PUT 替換; PATCH 修改部分)
  • DELETE 方法表示向指定的資源刪除資料

實作 rails 的過程其實一直在歷經這樣操作,也是因為這樣風格規範之下可以呈現簡明的網址設計。


參考資料:

  1. 淺談 REST 軟體架構風格 (Part.I) - 從了解 REST 到設計 RESTful!
  2. RESTful API 設計準則與實務經驗
  3. Rails 實戰聖經
  4. 簡單理解 REST 設計風格與 RESTful API
  5. 為你自己學 Ruby on Rails

上一篇
Day 14 - 進入Rails世界必須懂:MVC 是甚麼?
下一篇
Day 16 - 進入Rails世界必須懂:Routes (上)
系列文
一探紅寶石的神秘面紗 - Ruby 及 Rails入門介紹 系列30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言