REST表示表示狀態轉移。這是一種考慮構建客戶端和服務器之間的網絡通信的方式,重點是將資源從服務器傳輸到客戶端,然後再返回。
要理解這首先考慮一個不同的體系結構,遠程過程調用的意義。這就是客戶端在服務器上調用函數的地方,就好像該函數存在於客戶端上一樣。
所以你想編輯服務器上存在的照片。您的客戶端是一個使用RPC來實現此目的的照片編輯應用程序。您想模糊照片,以便您的客戶端使用RPC調用blur()函數,並且服務器模糊圖像併發送更新後的圖像。然後,您要旋轉圖像,以便您的客戶端調用rotate()函數,服務器旋轉圖像並將旋轉後的圖像發送到客戶端。
您可能已經注意到兩個問題。首先,每當您對照片執行操作時,服務器需要做一些工作並將更新的圖像發回給您。這使用了很多帶寬。其次,如果明天服務器開發人員(可能與客戶端開發人員無關)決定rotate()是錯誤的函數名稱,它應該是rotate_image(),並且他們更新服務器,會發生什麼情況。您的客戶端繼續調用rotate(),但現在失敗了,因爲客戶端上不存在這樣的函數。
REST是思考客戶端/服務器通信的另一種方式。爲什麼客戶不會僅僅獲得資源的表示並執行所需的所有操作(模糊,旋轉等),而是要讓服務器對資源執行操作(例如旋轉照片)然後將新的資源狀態發送回服務器。
如果你這樣做了,客戶端和服務器之間的通信協議可以保持非常簡單,只需要很少的更新。您所需要的只是爲客戶端獲取資源和功能以將其放回服務器上的功能。客戶端必須知道如何模糊圖像並旋轉圖像,但不需要知道如何告訴服務器執行此操作,只需要告訴服務器保存更新的圖像。
這意味着客戶端的開發人員可以獨立地向服務器開發人員實施新功能。如果客戶端的開發人員與服務器無關(Firefox的開發人員與紐約時報網站無關,反之亦然),非常方便。
HTTP就是這樣的協議,遵循這種架構模式允許網絡像現在一樣增長。在HTTP中有一小部分動詞(函數),它們只關心在客戶端和服務器之間來回傳遞資源表示。
使用HTTP您的照片客戶端只需發送一個GET
消息到服務器來獲取照片。然後,客戶可以完成它想要的照片。完成後,它將PUT
消息和更新的照片發送到服務器。
由於協議中沒有特定於域的操作(模糊,旋轉,調整大小),此協議也可用於任意數量的資源。 HTTP不關心資源是HTML文檔,WAV文件,Javascript腳本還是PNG圖像。客戶顯然關心,因爲它需要了解它獲得的資源,服務器也可能會關心。但客戶端和服務器之間的協議無需關心。 HTTP唯一知道的是HTTP頭中有一個變量Content-Type
,服務器可以告訴客戶端這是什麼類型的資源。
這非常強大,因爲這意味着您可以獨立更新您的客戶端以更新服務器而無需更新傳輸協議。 HTTP尚未多年更新。另一方面,HTML不斷更新,網絡服務器和網絡瀏覽器不斷更新(Chrome版本爲33)。這些更新可以獨立於彼此進行,因爲HTTP從不(很少)發生更改。
10年前的網絡瀏覽器仍然可以通過HTTP與現代Web服務器進行通信以獲取資源。瀏覽器可能不瞭解該資源,稱它獲得了一個它無法理解的WebM視頻,但它仍然可以獲取此資源,而不會導致網絡通信失敗。
與上面RPC的示例相反,如果服務器將rotate()
更改爲rotate_image()
,客戶端服務器通信將中斷。每個客戶端都必須使用這個新功能進行更新,否則在嘗試與服務器交談時會崩潰。
所以REST是一種思考客戶端服務器通信的方式,它是一種架構設計/模式。 HTTP是一種在這種思維方式下工作的協議,專注於簡單地在服務器和客戶端之間傳輸資源的狀態。
現在,瞭解歷史上很多人(包括網絡開發人員)都沒有得到這一點很重要。因此,您有像開發人員將動詞放入資源名稱的嘗試來模擬HTTP上的遠程過程調用。像
事情變得http://www.mywebsite.com/image/blur_image
,他們將在URI /image/blur_image
硬編碼到他們的客戶端,然後嘗試,並確保人開發服務器從來沒有改變過的URI blur_image
。你回到RPC的所有問題。只要服務器人員將資源blur_image
(這不是真正的資源開始)移動到/image/blur_my_image
,客戶就會因爲它將硬編碼爲執行操作而不是簡單地獲取/image
,並且執行任何想要的操作到它。
所以網上有很多關於REST的例子是錯誤的。 任何緊密耦合客戶端和服務器通信的東西都是REST錯誤。您的客戶應該能夠在URI更改或內容類型不更新的情況下繼續存活下來。它可以抱怨它不理解資源(例如,Netscape Navigator 2.0抱怨它不知道HTML5文檔是什麼),但它應該抱怨URI已經改變。這是REST的可發現性方面,我沒有太多介紹,但基本上你的客戶端應該能夠從服務器的根目錄http://www.mywebsite.com
開始,並且如果它理解了內容類型,它應該能夠繼續到它想要的資源。除了服務器的根目錄之外,您不應該將一個URI硬編碼到客戶端。
我可以寫一本關於這個東西的書(很多都有),但是我希望能夠很好地介紹REST的實際情況。
REST是HTTP API模式,僅此而已。您的具體實施完全不可知。 –
請您詳細說明一下。我沒有得到你。 – javafan
Ofcourse當然,你可以用它來替換servlet,只能從其他服務中返回數據,你不能做一些其他的東西,比如管理會話,處理會話和請求屬性,將請求重定向到另一個視圖等。 –