這篇文章中使用的示例代碼可以在這里找到。
短暫休息
REST (表示狀態轉移)并不是什么新鮮事物,它是在2000年首次提出的(Fielding, 體系結構樣式和基于網絡的軟件體系結構設計 ),但是今天它仍然未被充分利用,只是在最近幾年才真正流行起來。 。 它用于通過URL描述資源,并允許操縱此類資源。 這個想法是利用HTTP協議在客戶端和服務器之間創建一個與平臺無關的,無狀態的,緩存友好的接口。 盡管REST可以應用于其他協議,但目前我們僅關注HTTP。
用更簡單的術語來說,諸如“ http://www.myserver.com/files/text.txt”之類的URL描述了一個資源,該資源是一個名為text.txt的文件,位于myserver.com域中。 那里什么都沒有 您可以將瀏覽器指向該文件,瀏覽器將向服務器發送GET請求以獲取該文件。 您甚至不需要編寫任何應用程序就能做到這一點。 任何客戶端和服務器都將以這種方式進行通信。
其他請求方法變得更加有趣。 每個閱讀本文的人都應該熟悉POST方法(通常用于表單)。 在REST應用程序中,發布到URL表示您要編輯該URL上的資源。 不太常用的PUT和DELETE方法分別用于創建和刪除資源。 例如,PUT http://www.myserver.com/files/text.txt應該創建一個文本文件,通常包含請求正文的內容。 值得注意的是,在某些系統中,尤其是那些旨在直接與瀏覽器進行交互的系統,出于某些目的,有時會劫持POST方法,因為某些瀏覽器對這兩種方法的處理不太好。
REST還使用標頭來控制緩存或確定客戶端期望的內容類型或語言。 畢竟,一個請求是一個普通的舊HTTP請求。 這很不錯,很干凈,很靈活,并且不會為您提供與SOAP提供相同功能所需的大量管道服務。 在這一點上,我們使用它的原因應該很清楚。
靜態資源類的解剖
盡管幕后有很多事情要做,但是Jersey很好地完成了將復雜性隱藏在漂亮的注解背后的工作。 考慮以下:
@Path("/people/{code}")public class Individual {@GET@Produces({"application/json", "application/xml"})public Object find(@PathParam("code") String code) { ... }@DELETEpublic void remove(@PathParam("code") String code) { ... }}
這是一個簡單的類,可以根據唯一的代碼查找或刪除一個人的條目。 第一個批注“路徑”指定該類(或方法–如果需要,您可以在方法級別覆蓋路徑)映射到哪個URL。 在這種情況下,我們要說的是,我們希望此類處理對“ [任何域] /人”的請求; 我們還將期望在“人員”之后有一個值,我們將其視為我們想要的人的唯一代碼–就是括號中的值。
我們可以在路徑中使用多個變量。 例如,我們可以說“ / team / {team_id} / {position}”或什至“ / team / {team_id} / staff / {position}”來獲取填補團隊中給定職位的人員的詳細信息,取決于我們想要的詳細程度。 我們還可以對參數施加限制; 例如,如果我們希望代碼為數字值,則可以將其定義為“ {code:[0-9] *}”; 該定義接受正則表達式模式。
GET和DELETE批注指定哪個Java方法應該處理哪個HTTP方法。 這些方法還有POST和PUT批注。
PathParam批注從請求URL中獲取參數,并將其傳遞給方法-在這種情況下,它將獲取code參數。 到目前為止,不言自明 –甚至還有FormParam和HeaderParam版本可以分別從POST表單字段或請求標頭中獲取值。
我發現Produces注釋非常有趣。 批注的參數采用MIME類型的集合,這些類型聲明了該方法能夠生成的返回類型。 在以上兩種情況下,我們都可以提供JSON或XML響應-根據請求的ACCEPT標頭的值選擇要返回的響應-如果請求接受該方法提供的一種以上返回類型,則第一個返回最好在ACCEPT標頭中列出。
歸還任何東西
當返回用XmlRootElement注釋的類的實例時,Jersey負責確定返回類型,并將該對象轉換為所需的表示形式。 不用大驚小怪,不需要音樂。 如果您需要進行一些更高級的格式化(例如,轉換為PDF或html頁面),那么它應該與編寫和注冊給定類型的編組器一樣簡單,盡管我還沒有深入研究。
用彈簧接線
當然,該資源類現在正處于適當的位置。 要將其放置在Web應用程序中,我們需要對其進行設置,而Spring將用于此目的。 忍受我 這不是很冗長,一次。
首先,我們需要告訴Spring我們的資源是可配置的組件。 為此,我們只需對類中的Component標注進行排序即可。 然后,我們需要定義范圍; 由于REST是無狀態的,因此我們將繼續使用Scope批注(其值為“ request”)聲明一個請求范圍。 還沒有驚喜! 現在,我們的類聲明如下所示:
@Component@Scope("request")@Path("/people/{code}")public class Individual {...}
最后,只需告訴Spring在哪里尋找您的組件即可:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="your.namespace.here" /></beans>
–驚喜–注入注釋以填充其字段。 僅此而已...您已經準備好要使用的REST資源。
并非全部
這就是全部。 除了我仍在研究的一些問題外-JAXB在找到循環參考時完全失去了大理石,使某些對象模型難以整理– JSR 311提供了一種將所有這些組合在一起的真正干凈的方法。
有一個抱怨。 集合返回類型似乎是一個問題。 可以通過將集合包裝在容器中來繞過此操作,但這似乎是不必要的步驟。
樣品申請
該示例應用程序可以通過jQuery ajax調用從服務器上的內存映射中列出,加載或刪除單個條目。 它已打包在兩個WAR文件中(服務器和客戶端)。 由于瀏覽器沙箱,請確保客戶端程序包和服務器程序包都在同一域中; 如果您以編程方式連接到服務器,則不存在此限制。
我想我可能已經展示了POST或PUT的示例,但實際上,它足夠簡單,我真的很討厭編寫表單。
參考: JCG合作伙伴 提供的Jersey和Spring的RESTful Web應用程序 ? The Simple Part博客中的Karl Agius。
翻譯自: https://www.javacodegeeks.com/2012/03/restful-web-applications-with-jersey.html