帶有Jersey和Spring的RESTful Web應用程序

幾個月前,我們的任務是創建一個API,以向第三方開發人員公開我們系統中的某些功能。 我們選擇將這些功能公開為一系列REST Web服務。 我開始使用Jersey ,它是JSR 311 (用于Restful Services的Java API)的參考實現; 事實證明,這是一個很好的驚喜,因為它被證明是極其強大和優雅的。 在本文中,我們將使用Jersey創建一個非常簡單的REST Web服務。

這篇文章中使用的示例代碼可以在這里找到。

短暫休息
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] *}”; 該定義接受正則表達式模式。

GETDELETE批注指定哪個Java方法應該處理哪個HTTP方法。 這些方法還有POST和PUT批注。

PathParam批注從請求URL中獲取參數,并將其傳遞給方法-在這種情況下,它將獲取code參數。 到目前為止,不言自明 –甚至還有FormParamHeaderParam版本可以分別從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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373602.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373602.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373602.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于更新pip的心得

如果pip install --upgrade pip 刪除了自己&#xff0c;但是無法安裝新的自己。 那么下載最新的pip,解壓 1、在命令窗口輸入 python(前提條件已經在系統路徑) setup.py(pip 包里的腳本) install 即可 2、注銷一下&#xff0c;讓pip在系統路徑生效 3、打開cmd&#xff0c;輸…

Linux/Unix/Mac 系統GIT密碼存儲

新建一個 ~/.netrc 文件&#xff0c; 將 git 服務器&#xff0c; 用戶名以及密碼記錄在這個文件&#xff0c; 如下所示&#xff1a; machine your-git-server login your-username password your-password普通用戶的 git-server 填 github.com 就可以了. 如果有多個 server 就…

財務部門:你需要多長時間才能夠回答老板的這些問題?

企業經營管理中&#xff0c;對管理決策者來說&#xff0c;有許多問題是希望隨時都知道的&#xff0c;下面&#xff0c;我們一起來探討一下&#xff0c;這些常見的問題&#xff0c;我們怎么來快速回答。首先&#xff0c;我們來回答以下幾個問題&#xff1a;注&#xff1a;這幾個…

yield方法釋放鎖嗎_死磕Synchronized底層實現重量級鎖

點擊上方“Java知音”&#xff0c;選擇“置頂公眾號”技術文章第一時間送達&#xff01;作者&#xff1a;farmerjohngit鏈接&#xff1a;https://github.com/farmerjohngit本文為死磕Synchronized底層實現第四篇文章&#xff0c;內容為重量級鎖實現。本系列文章將對HotSpot的sy…

Java應用程序上的Twitter API

是否曾想過將推文附加到Java應用程序&#xff1f; 我為此尋找了最好的API&#xff0c;很幸運&#xff0c;我找到了它&#xff01; http://twitter4j.org/ 一個簡單的方法&#xff1a; 我們需要做的第一件事是在您的Twitter帳戶中創建一個應用程序&#xff0c;為其授予訪問權限…

ps aux和ps -ef命令區別

ps aux 是用BSD的格式來顯示 java這個進程顯示的項目有&#xff1a;USER,PID,%CPU,%MEM,VSZ,RSS,TTY,STAT,START,TIME,COMMANDps -ef 是用標準的格式顯示java這個進程顯示的項目有&#xff1a;UID,PID,PPID,C,STIME,TTY,TIME,CMD&#xff09;轉載于:https://www.cnblogs.com/ya…

gulp學習筆記3

gulp系列學習筆記&#xff1a; 1、gulp學習筆記1 2、gulp學習筆記2 3、gulp學習筆記3 4、gulp學習筆記4 1、編譯sass Sass 是一種 CSS 的開發工具&#xff0c;提供了許多便利的寫法&#xff0c;大大節省了開發者的時間&#xff0c;使得 CSS 的開發&#xff0c;變得簡單和可維護…

MongoDB學習1——Windows 下配置及啟動mongodb服務器

1.下載mongodb程序&#xff1a;http://lt1.cr173.com/soft2/mongodb.zip 2.解壓程序3.在解壓后的mongodb文件夾中創建 data、logs、conf文件夾4.編寫配置文件conf\mongod.conf#端口號 port 12345 #數據庫路徑&#xff0c;也可以使用絕對路徑 dbpath data #日志路徑&#xff0…

JavaFX 2.0條形圖和散點圖(以及JavaFX 2.1 StackedBarCharts)

JavaFX 2.0提供了用于生成圖表的內置功能&#xff0c;該功能可在javafx.scene.chart包中找到。 在本文中&#xff0c;我將介紹如何使用JavaFX 2.0創建條形圖和散點圖 。 在本文的學習過程中&#xff0c;我將一路使用Guava和一些Java 7功能。 在演示JavaFX 2.0圖表API之前&#…

python中下劃線開頭的命名_Python 中各種下劃線的騷操作:_、_xx、xx_、__xx、__xx__、_classname_...

我們在定義一些變量或者方法的時候&#xff0c;常常會用到下劃線&#xff0c;在 Python 中&#xff0c;下劃線可是很有用處的喲&#xff0c;比如變量&#xff0c;有些是一個下劃線開頭的(_xx)&#xff0c;有些是兩個下劃線開頭的(__xx)&#xff0c;有些是在名稱的結尾添加下劃線…

MongoDB學習2——Windows 使用mongo連接數據庫

一、查看mongo幫助文檔mongo.exe --help二、使用mongo 連接服務器mongo.exe 數據庫地址&#xff1a;數據庫端口號/數據庫關閉服務器db.shutdownServer()注&#xff1a;關閉數據必須使用admin數據庫權限

【UVA 10816】 Travel in Desert (最小瓶頸樹+最短路)

【題意】 有n個綠洲&#xff0c; m條道路&#xff0c;每條路上有一個溫度&#xff0c;和一個路程長度&#xff0c;從綠洲s到綠洲t&#xff0c;求一條道路的最高溫度盡量小&#xff0c; 如果有多條&#xff0c; 選一條總路程最短的。 InputInput consists of several test cases…

[OJ] Data Stream Median (Hard)

LintCode 81. Data Stream Median (Hard) 思路: 用一個大根堆保存較小的一半數, 一個小根堆保存較大的一半數.每次根據num和兩個堆頂的數據決定往哪個堆里面放.放完后進行平衡確保兩個堆的size差不超過1.利用兩個堆的size和堆頂值計算median.大根堆可以表示為priority_queue<…

書評:JBoss AS 7:配置,部署和管理

我熱切地接受Packt Publishing邀請復審JBoss AS 7&#xff1a;配置&#xff0c;部署和管理&#xff0c;因為自從我上次使用JBoss已有數年了&#xff0c;我很想了解有關JBoss AS 7的更多信息。 我已經寫過關于《 JBoss AS 7配置&#xff0c;部署和管理》一書的第一印象&#xff…

聯想小新air14筆記本黑屏_聯想小新air14銳龍版測評,談談它的好和壞

聯想小新air14銳龍版本測評了解數碼就找小俠客&#xff0c;我是機圈小俠客 今天呢&#xff0c;主要和大家測評一下聯想小新air14這款筆記本&#xff0c;總體而言的話&#xff0c;這款筆記本它是一個。對于辦公人士或者輕度游戲愛好者來說的話&#xff0c;是一個不錯的選擇&…

MongoDB學習3——mongoDB的一些基本使用

#查看所有數據庫show dbs;#創建&#xff08;切換&#xff09;數據庫use DATABASE_NAME注&#xff1a;如果數據庫不存在&#xff0c;則創建數據庫&#xff0c;否則切換到指定數據庫。#插入文檔&#xff08;關系型數據說法叫插入數據&#xff09;方式一&#xff1a;db.COLLECTION…

Java入門:Java下載與安裝方法

本文適合剛入門的Java編程的初學者閱讀。 JDK有兩種下載方法&#xff0c;一個是官網下載&#xff0c;另一個是第三方網站下載。官網速度也許有點慢&#xff0c;慢的話可以考慮去第三方網站下載。 一、官網下載 1. 訪問地址&#xff1a;http://www.oracle.com/cn/downloads/inde…

jquery獲得下拉框的值

獲取Select &#xff1a; 獲取select 選中的 text : $("#ddlRegType").find("option:selected").text(); 獲取select選中的 value: $("#ddlRegType ").val(); 獲取select選中的索引: $("#ddlRegType ").get(0).selectedIndex; 設置sel…

Java 7:如何編寫非常快速的Java代碼

當我第一次寫此博客時&#xff0c;我的目的是向您介紹ThreadLocalRandom類&#xff0c;它是Java 7中新增的用于生成隨機數的類。 我已在一系列微基準測試中分析了ThreadLocalRandom的性能&#xff0c;以了解其在單線程環境中的性能。 結果相對令人驚訝&#xff1a;盡管代碼非常…

python 微信支付接口 詳解_Python支付接口匯總大全(包含微信、支付寶等,長期更新、歡迎補充)...

wzhifuSDK- 由微信支付SDK 官方PHP Demo移植而來&#xff0c;v3.37下載地址學習Python中有不明白推薦加入交流群號&#xff1a;864573496群里有志同道合的小伙伴&#xff0c;互幫互助&#xff0c;群里有不錯的視頻學習教程和PDF&#xff01;weixin_pay- 是一個簡單的微信支付的…