# Restful
Rails從1.2版本就開始實現RESTful了。
### 什么是REST(Representational State Transfer) 及 RESTFul
REST(Representational State Transfer)軟件架構,是由Roy Thomas Fielding博士在2000年首次提出的。直到2005年,隨著Ajax、Rails等Web開發技術的興起,在Web開發技術社區掀起了一場重歸Web架構設計本源的運動,REST架構風格得到了越來越多的關注。在2007年1月,支持REST開發的Ruby on Rails 1.2版正式發布,并且將支持REST開發作為Rails未來發展中的優先內容。Ruby on Rails的創始人DHH做了一個名為“World of Resources”的精彩演講,DHH在Web開發技術社區中的強大影響力,使得REST一下子處在Web開發技術舞臺的聚光燈之下。
直到今天,幾乎看不到不支持REST開發的Web開發框架了。
所以,要想掌握Rails,REST是必須要理解的概念,除非你回去用Rails1.2之前的版本。
REST軟件架構遵循了CRUD原則,該原則告訴我們對于資源(包括網絡資源)只需要四種行為:創建(Create)、獲取(Read)、更新(Update)和銷毀(DELETE)就可以完成對其操作和處理了。
REST的特點有五個:
- 資源(Resource)
- 資源的表述(Representation)
- 狀態轉移(State Transfer)
- 統一接口(Uniform Interface)
- 超文本驅動(Hypertext Driven)
分別代表:
1.
資源: 是服務器的一種抽象,服務器是由很多離散資源所組成。資源以名詞為核心來組織,一個資源可由一個或多個URI來標識,URI既是資源的名稱,也是資源的地址。資源可以是系統上的文件、可以是數據庫中的表等具體的東西,也可以說其他抽象的東西,只要開發者自己能理解。
1.
資源的表述: 資源的表述是一段對于資源在某個特定時刻的狀態的描述。可以在客戶端-服務器端之間轉移(交換)。資源的表述可以有多種格式,例如HTML/XML/JSON/純文本/圖片/視頻/音頻等等。資源的表述格式可以通過協商機制來確定。請求-響應方向的表述通常使用不同的格式。
1.
狀態轉移:是指在客戶端和服務端之間通過轉移代表資源狀態的表述(json/html/xml等),來實現操作資源的目的。
1.
統一接口:REST要求,必須通過統一的接口來對資源執行各種操作。對于每個資源只能執行一組有限的操作。以HTTP/1.1協議為例,HTTP/1.1協議定義了一個操作資源的統一接口,主要包括以下內容:
7個HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
1.
超文本驅動: 資源之間通過超鏈接相互關聯,超鏈接既代表資源之間的關系,也代表可執行的狀態遷移。
### 與REST架構風格并行的其他架構風格
-
分布式對象(Distributed Objects,簡稱DO) 架構實例有CORBA/RMI/EJB/DCOM/.NET Remoting等等
-
遠程過程調用(Remote Procedure Call,簡稱RPC) 架構實例有SOAP/XML-RPC/Hessian/Flash AMF/DWR等等
### Rails中的REST實現
- Rails中的每個Controller被看作一個資源
- 資源的CRUD,Rails默認支持使用HTTP的GET/POST/PUT/DELETE
- 路由系統和URL Helper 方法生成基于RESTful的超鏈接
Rails中定義資源, config/routes.rb文件中:
~~~
resources :photos
~~~
Rails中action和http 方法的對應表:
| HTTP Verb | Path | action | used for |
|-----|-----|-----|-----|
| GET | /photos | index | 顯示所有的photos資源 |
| GET | /photos/new | new | 返回一個創建新photo的頁面 |
| POST | /photos | create | 創建一個新的photo資源 |
| GET | /photos/:id | show | 顯示一個指定的photo資源 |
| GET | /photos/:id/edit | edit | 返回一個編輯指定photo資源的html頁面 |
| PATCH/PUT | /photos/:id | update | 更新一個指定的photo資源 |
| DELETE | /photos/:id | destroy | 刪除一個指定的photo資源 |
注: PATCH只有Rails4支持。
上面的表中,我們可以看到Rails的action對應的HTTP方法,是符合RESTful的。
再看看Rails提供的URL Helper方法:
- photos_path 生成的path: /photos
- new_photo_path 生成的path: /photos/new
- edit_photo_path(:id) 生成的path: /photos/:id/edit (例如, edit_photo_path(10) 生成的path: /photos/10/edit)
- photo_path(:id) 生成的path: /photos/:id (例如, photo_path(10) 生成的path: /photos/10)
### 小結:
RESTful架構,我自己的理解,用一句話簡單的描述:
用HTTP本身提供的方法來響應服務器資源,并來修改其狀態,就是RESTful的。
比如 GET [http://www.xxx.com/photos](http://www.xxx.com/photos) 就是要獲取photos的所有資源。
非RESTFul的方式是這樣的,拿RPC風格來舉例: GET或POST請求, [http://www.xxx.com/get_photos](http://www.xxx.com/get_photos) 而這個get_photos是你自己定義的,別人也可以定義為get_all_photos,一點都不統一。并且忽略了HTTP方法本身的意義。
所以,RESTful,叫重歸Web架構設計本源。
對于這個概念,也要求大腦里先有這個概念,后面我們再慢慢深入。
那么REST架構和MVC架構是否沖突?
我覺得不沖突, MVC是來描述系統內部的代碼組織與數據流向,而REST架構,是一種Web Service接口規范。一個是內部,一個是外部。
了解Restful架構,對于我們理解Chef Server Api至關重要。
- 序
- Chapter 1: 初識Chef
- 一些背景
- Chef vs Puppet
- Chapter 2: Chef應用
- Chef架構
- Chef能做什么
- Chef組件
- Chef環境安裝
- chef-server
- opscode-chef
- chef-solo
- Chef實戰
- 實戰前的必修理論
- 使用Chef
- Chapter 3: Ruby基礎
- 對象與方法
- 標識符
- 類與模塊
- 數據類型
- 真與假
- 控制語句
- 代碼塊
- Chapter 4: Chef源碼架構
- Rubygems與gem
- bundler
- Chef源碼組織
- Chapter 5: Rails基礎
- Rails是什么
- MVC架構
- Restful
- Rails組成與項目結構
- Chapter 6: Chef Server WebUI
- Chef Server Webui組織結構
- Chef Rest API
- 參考