Jersey 開(kāi)發(fā)RESTful(八)Jersey參數(shù)綁定

【原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文章地址水援,謝謝密强!】

在所有的Web類應(yīng)用中茅郎,參數(shù)的綁定都是一個(gè)非常重要的話題,本章中或渤,就來(lái)看看Jersey中的參數(shù)綁定方式系冗。

綁定路徑參數(shù)

我們已經(jīng)知道路徑參數(shù)在針對(duì)某個(gè)資源,或者有子資源的情況下使用薪鹦,比如/depts/1/emps/掌敬,查詢id為1的部門(mén)下的所有員工。在Jersey中池磁,使用@PathParam完成路徑參數(shù)綁定:

/**
 * 映射url中的路徑參數(shù)
 * 
 * @param id
 * @return
 */
@GET
@Path("{id}")
public String pathParam(@PathParam("id") Long id) {
    System.out.println(id);
    return "success";
}

當(dāng)然也可以對(duì)多個(gè)路徑參數(shù)進(jìn)行綁定:

/**
 * 對(duì)多個(gè)路徑參數(shù)進(jìn)行綁定
 * @param id
 * @param month
 * @return
 */
@GET
@Path("{id}/summary/{month}")
public String pathParam2(@PathParam("id") Long id,@PathParam("month")int month) {
    System.out.println(id);
    System.out.println(month);
    return "success";
}

映射普通請(qǐng)求參數(shù)

在實(shí)際開(kāi)發(fā)中奔害,類似對(duì)資源的查詢等操作,需要通過(guò)GET方法獲取請(qǐng)求中的查詢參數(shù)內(nèi)容地熄。Jersey提供了@QueryParam注解完成參數(shù)綁定华临。

/**
 * 映射請(qǐng)求參數(shù),需要是GET/POST請(qǐng)求
 * 
 * @param name
 * @return
 */
@GET
@Path("/query")
public String queryParam(@QueryParam("name") String name) {
    System.out.println(name);
    return "success";
}

要觸發(fā)這個(gè)請(qǐng)求离斩,必須使用GET[POST] /params/query?name=wolfcode來(lái)請(qǐng)求银舱。那么@QueryParam就可以把wolfcode正確的注入到name參數(shù)中瘪匿。

映射表單提交參數(shù)

使用表單提交是互聯(lián)網(wǎng)應(yīng)用再常見(jiàn)不過(guò)的方式跛梗,在SpringMVC中,提供了各種牛逼的能力來(lái)把表單中的數(shù)據(jù)映射到方法的參數(shù)棋弥,模型中核偿,但是在這塊上,Jersey同樣很強(qiáng)大顽染,但是稍微使用復(fù)雜一點(diǎn)仔戈。要演示表單提交參數(shù)綁定伐蒂,我們先創(chuàng)建一個(gè)簡(jiǎn)單的Employee類:

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Employee {

    private Long id;
    private String name;
    private int age;
}

需求:根據(jù)提交的數(shù)據(jù)創(chuàng)建一個(gè)Employee對(duì)象。

/**
 * 映射表單提交參數(shù),要求請(qǐng)求是POST,PUT,并且編碼格式必須是x-www-form-urlencoded
 * 
 * @param name
 * @param age
 * @return
 */
@PUT
@Path("/form")
@Produces(MediaType.APPLICATION_JSON)
public Employee formParam(@FormParam("name") String name, @FormParam("age") int age) {
    return new Employee(1L, name, age);
}

普通值綁定

第一種方式落剪,在Jersey中,提供了一個(gè)@FormParam注解來(lái)完成表單中內(nèi)容到參數(shù)的綁定(API文檔解釋撒桨,是綁定一個(gè)請(qǐng)求實(shí)體中的表單參數(shù)到資源方法參數(shù) Binds the value(s) of a form parameter contained within a request entity body to a resource method parameter)煤禽。
注意幾個(gè)點(diǎn):
1,@FormParam注解只能接受x-www-form-urlencoded編碼格式的form表單提交振亮,這個(gè)是必要條件巧还;
2,@FormParam注解能夠完成的綁定類型有坊秸,

  • 簡(jiǎn)單類型麸祷;
  • 綁定到一個(gè)對(duì)象,要求這個(gè)對(duì)象的類有一個(gè)接受單個(gè)String類型的構(gòu)造器褒搔;
  • 綁定到一個(gè)對(duì)象阶牍,要求這個(gè)對(duì)象的類有一個(gè)valueOf(String)或者fromString(String)的靜態(tài)的構(gòu)建方法喷面,比如
public static Employee valueOf(String name){
   return new Employee(name);
}
  • 提供一個(gè)ParamConverterProvider(這個(gè)后面講Provider);
  • 可以綁定到一個(gè)List<T>荸恕,Set<T>上面乖酬,例如:
@POST
@Path("/hobby")
@Produces(MediaType.APPLICATION_JSON)
public Employee formParam(@FormParam("hobby") Set<String> hobbies) {
    System.out.println(hobbies);
    return new Employee();
}

那么,使用POST param/hobby?hobby=java&hobby=haha&hobby=hehe 就可以完成Set<String>的綁定(注意表單編碼格式一定是x-www-form-urlencoded)融求。

另外咬像,@FormParam可以配合一個(gè)@DefaultValue標(biāo)簽來(lái)設(shè)置默認(rèn)值,簡(jiǎn)單演示:

@PUT
@Path("/form")
@Produces(MediaType.APPLICATION_JSON)
public Employee formParam(@FormParam("name") String name, 
                          @DefaultValue("18") @FormParam("age") int age) {
    return new Employee(1L, name, age);
}

當(dāng)@FormParam綁定失敗即可使用@DefaultValue設(shè)置的值生宛。

綁定到對(duì)象

在SpringMVC中县昂,我們更常見(jiàn)的是直接把請(qǐng)求參數(shù)綁定到一個(gè)我們需要的模型或者VO中。在Jersey中陷舅,使用@FormParam注解無(wú)法完成倒彰,可以使用@BeanParam和@FormParam配合使用:

首先修改Employee對(duì)象:

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Employee {

    private Long id;
    @FormParam("name")
    private String name;
    @FormParam("age")
    private int age;
}

注意,我們把@FormParam標(biāo)簽移動(dòng)到了Employee的對(duì)應(yīng)屬性上莱睁。當(dāng)然在實(shí)際開(kāi)發(fā)中待讳,更多應(yīng)該是在VO對(duì)象類中;

/**
 * 直接映射到模型仰剿,要求請(qǐng)求是POST,PUT,并且編碼格式必須是x-www-form-urlencoded
 * 
 * @param e
 * @return
 */
@POST
@Path("/formpojo")
@Produces(MediaType.APPLICATION_JSON)
public Employee formPojoParam(@BeanParam Employee e) {
    e.setId(2L);
    return e;
}

然后创淡,再使用Jersey提供了@BeanParam注解,完成請(qǐng)求參數(shù)到自定義模型的綁定南吮。注意琳彩,在自定義模型中,不光可以使用@FormParam部凑,可以使用@XXXParam露乏,比如前面提到過(guò)的@PathParam。

直接獲取表單內(nèi)容

前面介紹過(guò)使用@FormParam和@BeanParam來(lái)獲取表單中的數(shù)據(jù)涂邀,下面再介紹一種通過(guò)直接獲取表單內(nèi)容的方式:

/**
 * 使用MultivaluedMap直接獲取POST表單編碼格式必須是x-www-form-urlencoded的表單內(nèi)容
 * 
 * @param fs
 * @return
 */
@POST
@Path("/formui2")
public String formPojoParam(MultivaluedMap<String, String> fs) {
    System.out.println(fs);
    return "success";
}

那么獲取到的MultivaluedMap<String, String>類型中瘟仿,就包含了表單里面所有的參數(shù)內(nèi)容,每一個(gè)Entry的類型是<String,String[]>比勉,這點(diǎn)需要注意劳较。

映射請(qǐng)求頭參數(shù)

從請(qǐng)求頭中獲取一些參數(shù),比如請(qǐng)求頭中自定義的token等信息敷搪,可以直接使用Jersey提供的@HeaderParam注解完成:

/**
 * 通過(guò)@HeaderParam獲取請(qǐng)求頭內(nèi)容
 */
@GET
@Path("/head")
public String headParam(@HeaderParam("token") String token) {
    System.out.println(token);
    return "success";
}

那么在請(qǐng)求的時(shí)候兴想,我們可以在頭信息中添加:


image.png

就可以正常看到后臺(tái)把token綁定到token參數(shù)中赡勘。需要注意的是嫂便,@DefaultValue標(biāo)簽都是可以和這些@XXXParam配合使用的,并且也可以添加到需要綁定的模型屬性上的闸与。

綁定矩陣參數(shù)

矩陣參數(shù)聽(tīng)著很奇怪毙替,其實(shí)很簡(jiǎn)單岸售,比如我們?cè)谧龇猪?yè)的時(shí)候,可以使用類似這樣的請(qǐng)求:
/resource;pageSize=10;currentPage=2
注意厂画,這個(gè)請(qǐng)求并不是普通的參數(shù)提交方式凸丸,按照普通的方式,應(yīng)該是:
/resource?pageSize=10&currentPage=2
注意查看兩者的區(qū)別袱院。
那么使用矩陣參數(shù)有什么好處呢屎慢?在REST架構(gòu)中,矩陣參數(shù)可以把這些參數(shù)一起看做一個(gè)資源忽洛,意思就是上面的兩個(gè)連接中腻惠,第一個(gè)URI可以看做第二頁(yè),每頁(yè)10條resource資源欲虚,把這個(gè)整體作為一個(gè)資源去看待集灌;又比如這樣一個(gè)資源:
/players/ladder;level=king
就可以看成天梯中等級(jí)為王者的玩家,把這個(gè)概念直接作為一個(gè)資源整體看待复哆。

理解了矩陣參數(shù)欣喧,Jersey提供了@MatrixParam標(biāo)簽來(lái)完成矩陣參數(shù)的綁定:

/**
 * 從請(qǐng)求路徑中分離出key=value的值
 * 
 * @param currentPage
 * @param pageSize
 * @param keyword
 * @return
 */
@GET
@Path("/matrix")
public String matrix(@MatrixParam("currentPage") int currentPage, @MatrixParam("pageSize") int pageSize,
        @MatrixParam("keyword") String keyword) {
    System.out.println("currentPage:" + currentPage);
    System.out.println("pageSize:" + pageSize);
    System.out.println("keyword:" + keyword);
    return "success";
}

那么,當(dāng)我們做出請(qǐng)求

image.png

就可以正確的分別解析出其中的pageSize,currentPage和keyword參數(shù)梯找。但是需要注意一點(diǎn)唆阿,Jersey只能解析出處于最后一個(gè)路徑中的矩陣參數(shù)。

小結(jié)

至此初肉,Jersey提供的最基本的幾種請(qǐng)求參數(shù)綁定方式介紹完畢酷鸦,下一結(jié)介紹@Context注解的使用饰躲。

WechatIMG7.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牙咏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘹裂,更是在濱河造成了極大的恐慌妄壶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寄狼,死亡現(xiàn)場(chǎng)離奇詭異丁寄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泊愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)伊磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人删咱,你說(shuō)我怎么就攤上這事屑埋。” “怎么了痰滋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵摘能,是天一觀的道長(zhǎng)续崖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)团搞,這世上最難降的妖魔是什么严望? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮逻恐,結(jié)果婚禮上像吻,老公的妹妹穿的比我還像新娘。我一直安慰自己复隆,他們只是感情好萧豆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著昏名,像睡著了一般涮雷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轻局,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天洪鸭,我揣著相機(jī)與錄音,去河邊找鬼仑扑。 笑死览爵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镇饮。 我是一名探鬼主播蜓竹,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼储藐!你這毒婦竟也來(lái)了俱济?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钙勃,失蹤者是張志新(化名)和其女友劉穎蛛碌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辖源,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔚携,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了克饶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酝蜒。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖矾湃,靈堂內(nèi)的尸體忽然破棺而出亡脑,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布远豺,位于F島的核電站奈偏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏躯护。R本人自食惡果不足惜惊来,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棺滞。 院中可真熱鬧裁蚁,春花似錦、人聲如沸继准。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)移必。三九已至室谚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崔泵,已是汗流浹背秒赤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憎瘸,地道東北人入篮。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像幌甘,于是被迫代替她去往敵國(guó)和親潮售。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評(píng)論 6 342
  • 【原創(chuàng)文章锅风,轉(zhuǎn)載請(qǐng)注明原文章地址酥诽,謝謝!】 在之前的文章中遏弱,我們已經(jīng)看到了SpringMVC開(kāi)發(fā)REST應(yīng)用的方式...
    叩丁狼教育閱讀 50,371評(píng)論 6 28
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理盆均,服務(wù)發(fā)現(xiàn)塞弊,斷路器漱逸,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 今天中午,看微博熱門(mén)爆料游沿,白百合被曝出軌了饰抒? 被拍攝視頻中,白百何在泰國(guó)與一鮮肉男子泳池邊嬉戲打鬧诀黍,白百合笑的十分...
    _遠(yuǎn)方姑娘閱讀 560評(píng)論 0 0
  • 猶豫袋坑、糾結(jié)、斗爭(zhēng)……眯勾,決定枣宫。今年寒假在家過(guò)的有點(diǎn)太舒服婆誓,該折磨折磨自己慵懶的身體。 騎行去天津的想法早已在心中萌發(fā)...
    落拓野客閱讀 312評(píng)論 6 3