2014-02-24 144 views
0

我是RESTful web服務的新手。無論我通過互聯網閱讀了關於REST風格的Web服務,我都知道REST的工作類似於servlet + webservice。Web應用程序的穩定服務

我們的傳統webservice看起來像JSP-> Servlet - > Service - > DAO - > Database。

  1. 請問REST在這個層次中替換Servlet嗎?
  2. 我的最終目標是我的web應用程序應該支持移動應用程序和普通瀏覽器。在這種情況下使用REST是不錯的主意。如果不是,我們應該在什麼情況下使用REST?

我希望我的問題很清楚。

請幫幫我。 在此先感謝。

+0

REST是HTTP API模式,僅此而已。您的具體實施完全不可知。 –

+0

請您詳細說明一下。我沒有得到你。 – javafan

+1

Ofcourse當然,你可以用它來替換servlet,只能從其他服務中返回數據,你不能做一些其他的東西,比如管理會話,處理會話和請求屬性,將請求重定向到另一個視圖等。 –

回答

0

我們可以通過多種方式實現機器對機器的通信。 Web服務還有助於在不同平臺上製作的應用程序之間進行通信。 例如.net GUI可以調用一個java服務器端數據程序。 REST是基於HTTP協議的那種類型之一。

SOAP Web服務非常重要(使用大量的XML),因爲REST很簡單,您可以簡單地使用REST公開任何APIS。

作爲REST服務公開的服務可以由客戶端使用HTTP動詞的GET,POST,PUT和DELETE來調用,其含義與HTTP相同。

REST風格的Web服務公開其資源的狀態。

使用REST可以查詢任何格式(Json,XML ...)中的'員工'數據並進行表示。 Rest不會替換層次結構中的Servlet,實際上基於HTTP的REST方法會寫入此Servlet中。

請通過此網址:http://docs.oracle.com/javaee/6/tutorial/doc/gijqy.html

使用REST是不相關的移動或其他設備的瀏覽器體驗。它完全取決於所使用的客戶端技術以及您的瀏覽器與這些技術的兼容性。

使用REST是使用簡單的AJAX調用訪問客戶端數據的好主意。

+0

聲音好。但有可能用REST webservice替換servlet嗎?我當時想到這個鏈接http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/。在這個例子中,HelloWorldService的作用類似於servlet。這就是混淆的原因。 – javafan

+0

@javafan我認爲你的術語有點混亂。 REST是一種架構模式。 HTTP是一種遵循REST體系結構模式的網絡協議。Servlet和Jersey是用於HTTP通信的Java庫。 Servlet和Jersey都可以正確執行HTTP,儘管Jersey的設計者似乎更清楚HTTP的實際含義。換句話說,使用Servlet做HTTP錯誤似乎更容易。 –

+0

@javafan請參閱此主題[鏈接](http://stackoverflow.com/questions/12525771/servlet-vs-rest) –

0

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的實際情況。

0

@javafan我剛剛檢查了您提供的mykong示例。請注意,這不是標準的http servlet實現,它是一種jersy的休息方式。所以,當你映射所有的URI通過這個servlet com.sun.jersey.spi.container.servlet.ServletContainer並且你編寫了帶有註解@path的類時,Jersy運行時環境將爲你做必要的處理,比如轉換輸入和輸出對象到必要的格式(json,xml等),具體取決於你的配置。您可以編寫一個簡單的servlet,並在其中添加@path註釋中的方法,並在您發出相應請求時將其調用。但doGet和doPost方法是默認處理GET和POST方法的標準servlet方法。您可以將另一個方法添加到同一個servlet並添加更多限定符來處理您的請求。 @GET,@Produces(「xml」)等 我希望這有助於。