RESTful Rails – 簡單心得

Q: 所以,到底什麼是REST?

A: Representational State Transfer的簡稱,中文翻譯一點都不重要,反正大家都叫他REST。簡單的說,就是將一個網站的運作模式全部利用Http的介面來做互動,並且針對的是網站所提供的「資源」而不是「網頁服務」。所以這是一種Design Pattern,而不是某種開發技巧。

Q: 資源是啥?

A: 資源(resource)就是一個網站包含的內部資料,以一個社群網站來說,他的使用者,使用者之間的群組就是資源。

Q: 什麼叫做針對資源而不是網頁服務?

A: 首先要知道HTTP包含很多種「動詞」Verb,就是HTTP這個protocol提供的溝通介面,像是GET, POST, PUT, DELETE等。

接著我們從網址就可以很清楚的看到差異,假設有一個網站提供「搜尋某個使用者資訊」的功能,傳統的網址可能長這樣:

http://www.some_site.com/find_user?id=123

或是

http://www.some_site.com/user/find/123

傳統的方式會將要做的動作利用網址來傳達給server,可是這樣並沒有充分利用到HTTP的各種Verb,各個網站也沒有一個固定的介面,當要在許多網站之間溝通的時候,就會發生很大的麻煩。

然而,RESTful(也就是符合REST的風格) 的網址會長這樣

http://www.some_site.com/user/123 ; 並且搭配HTTP的「GET」
這樣可以解讀為 「GET」a 「user」 which id is 「123」from 「www.some_site.com」
翻譯就是「從www.some_site.com上取得(GET)一個id是123的user」

http://www.some_site.com/user/123就是一個資源(resource),這個網址就代表著id為123的user,至於是要對這個user做什麼樣的動作,就根據HTTP verb來判斷。

為甚麼要強調搭配GET?因為這就是RESTful的特色,根據不同的Verb會有不同的運作方式。同樣一個網址:

http://www.some_site.com/user/123;並搭配HTTP的「PUT」
會變成「PUT」a 「user」 data to 「www.some_site.com」which id is 「123」
也就是「更新(PUT)一個id是123的user資料到www.some_site.com上」

乍看之下,傳統方式與RESTful的網址感覺都很類似,都是利用網址來告訴server要做的動作,唯一的差別在於

「RESTful充分利用了HTTP各種的Verb」

以前我們用SQL的SELECT,  INSERT, UPDATE, DELETE對應到CRUD的find, create, update, destory
現在我們再把這個對應關係拓展到HTTP的GET,POST,PUT,DELETE,就這樣

好處在哪裡?一旦統一了RESTful的形式,假設我有一個已經建立好的使用者資訊群組網站A。今天我要做一個購物網站B,我不需要將A中的使用者資料全部複製到B,我可以直接從B去抓取A網站中的資源(resource),A網站完全不需要做任何的修改,B網站也不需要特別寫不同的方法,只要讓B知道有A這個資源可以利用,就可以直接在B中進行

User.find :all

之類的操作,而B完全不需要有User的Model!

總之,RESTful是一種網站的interface制定方式,所以REST是一種Design Pattern而不是開發技術。

當然更長遠的目標就是:一旦多數網站都以RESTful的方式設計, 那要基於這些已存在資料去建立新的網站(類似mashup)就變成非常容易的一件事情。

Update: 延伸閱讀

Advertisements

RESTful Rails – 簡單心得” 有 5 則迴響

  1. 畢竟空泛的言論比較容易量產阿。再加上對岸一堆網站不停的複製貼上XD

    難怪曾經在某處看過一篇文章叫「Don’t write tutorial for everything」之類的XD

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s