本篇文章小编给大家分享一下Jersey Restful接口获取参数的问题代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
简述
获取URI的参数
获取Get请求的参数
获取Post类型的参数
添加参数默认值
获取Map参数
1.@PathParam
使用该注释获取参数时可以获取URI中制定规则的参数
例如:
//该类的路径为/user @GET @Path("{username"}) @Produces(MediaType.APPLICATION_JSON) public User getUser(@PathParam("username") String userName) { ...}
当浏览器请求
http://localhost:8080/user/jack
时,username的值就是jack。请注意,这里的username并不是说key的值就是username,value是jack,而是说/user/后面就跟着username,这里的username只是一个变量。
2.@QueryParam
该参数用于获取Get请求中的查询参数,他和上一个的区别是它是通过URI中的?符号来实现的。
比如:
@GET @Path("/user") @Produces("text/plain") public User getUser(@QueryParam("name") String name, @QueryParam("age") int age) { ...}
当url的请求是
http://localhost:8080/user?name=cesar&age=21
时,此时函数获取的参数就是name=cesar而age=21;
3.@FormPara
顾名思义,是从Post请求的表单中获取数据。
@POST @Consumes("application/x-www-form-urlencoded") publicvoid post(@FormParam("name") String name) { // Store the message }
4.默认参数值DefaultValue
当你希望在函数获取参数时参数有一个默认值,那么就可以使用该注释,它的使用方法如下
@GET @Path("/user") @Produces("text/plain") public User getUser(@QueryParam("name") String name, @DefaultValue("26") @QueryParam("age") int age) { ...}
那么当请求age参数时如果age没有赋值,就会默认为26.
5.使用Map的参数@Context
在一个大型的server中,由于参数的多变,参数结构的调整很容易遇到问题,这时候就可以考虑使用@Context来进行注释了。例子如下:
@GET public String get(@Context UriInfo ui) { MultivaluedMapqueryParams = ui.getQueryParameters(); MultivaluedMap pathParams = ui.getPathParameters(); }
从例子中我们可以看出,其实Context就是其他几个参数的集合而已,只要熟练掌握了这几种参数以及他们代表的意义,你就可以熟练的操作Jersey了!
Restful接口传入多参数的问题及解决方案
结论:
restful风格的接口不支持多个参数
注:本文指的是通过json序列化参数的情况
1. 前置
一个定义用来测试的MyParam类
public class MyParam { private String str; private Integer integer; // 省略 getter和setter…… }
我在做测试的是用了Chrome的插件Advanced REST client,可以模拟浏览器发送各种请求,并自定义header和body。
测试的时候需要使用post方式,并在http请求header中加入
accept: application/json content-type: application/json
然后在htpp请求的Body中,输入json格式的参数,如{"str":"bb","integer":3}。
以下是几种多参数接口的形式,以及输入参数,以及解析结果。
2. 第一种:两个String参数
@POST @Path("demo") public Result function(String param1, String param2);
传入的参数:
{"param1":"bb","param2":"cc"}
解析出来的参数:
param1: "{"param1":"bb","param2":"cc"}"
param2: ""
这样的风格,传输过来的参数,读取的时候会读取request body中的inputStream,然后两个参数循环解析,解析完第一个参数的时候,会关闭inputStream,第二个参数再去读取inputStream的时候,读取到的就是空。
这样的话,传入的参数全部会赋值给第一个String对象,而第二个String解析出来后就是空字符串。
3. 第二种:一个对象参数,一个String参数
对于 第一个参数是封装对象的情况,能解析出来第一个对象,而第二个参数也是拿不到。
这种情况下不会报错,只是解析第一个对象的时候没有问题,解析第二个String拿到的就是空字符串。
@POST @Path("demo") @Consumes({MediaType.JSON}) public Result function(MyParam myParam, String param);
传入的参数:
{"str":"helo","integer":2},"string":"test"
解析出来的参数:
param1: 能正确解析对象myParam,其两个属性能正确赋值。
param2: ""
4. 第三种:一个String参数,一个对象参数
如果把两个参数的位置交换,则会把传入的参数全部解析给第一个String,而解析第二个对象的时候,由于拿到的数据是空,所以会报错。如下:
@POST @Path("demo") public Result function(String param, MyParam myParam);
传入的参数:
{"str":"helo","integer":2},"string":"test"
解析出来的参数:
param1: "{"str":"helo","integer":2},"string":"test""
param2: 会报错
5.解决方法
要解决传入多个参数的问题,有几个思路:
1. 封装对象,把要传的多个参数封装成一个对象传入
2. 在访问路径中嵌入变量,使用@PathVariable注解,在请求路径中写 “/demo/{1}/{2}”,然后在请求路径中相应的位置替换为要穿的参数即可,这种也只适用于包装类,如String。
3. 改变请求的content type,使用content-type: application/x-www-form-urlencoded,这种使用form表单提交的形式,可以传入两个参数,要结合使用@FormParam注解
6.关于使用form形式传入参数
接口的定义形式要修改
@POST @Path("demo") @Consumes({MediaType.APPLICATION_FORM_URLENCODED}) public Result function(@FormParam(value="string1")String string1, @FormParam(value="string2")String string2);
请求时,header参数要修改
accept: application/json content-type: application/x-www-form-urlencoded
请求Body中使用form形式
string1=wo&string2=kan
然后就可以正确解析到两个参数的值
解析出来的参数:
string1: wo
string2: kan
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整