【原創(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í)候兴想,我們可以在頭信息中添加:
就可以正常看到后臺(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¤tPage=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)求
就可以正確的分別解析出其中的pageSize,currentPage和keyword參數(shù)梯找。但是需要注意一點(diǎn)唆阿,Jersey只能解析出處于最后一個(gè)路徑中的矩陣參數(shù)。
小結(jié)
至此初肉,Jersey提供的最基本的幾種請(qǐng)求參數(shù)綁定方式介紹完畢酷鸦,下一結(jié)介紹@Context注解的使用饰躲。