spring mvc Restful接口传入多参数的问题和解决方案(参数全部注入第一个变量bug)
2018-01-08 18:19
302 查看
感谢原博主解决了我的问题,转自:http://blog.csdn.net/aitcax/article/details/53097562
注:本文指的是通过json序列化参数的情况
2
3
4
5
[/code]
我在做测试的是用了Chrome的插件
测试的时候需要使用post方式,并在http请求header中加入
2
[/code]
然后在htpp请求的Body中,输入json格式的参数,如
以下是几种多参数接口的形式,以及输入参数,以及解析结果。
2
3
[/code]
传入的参数:
解析出来的参数:
2
[/code]
这样的风格,传输过来的参数,读取的时候会读取request body中的inputStream,然后两个参数循环解析,解析完第一个参数的时候,会关闭inputStream,第二个参数再去读取inputStream的时候,读取到的就是空。
这样的话,传入的参数全部会赋值给第一个String对象,而第二个String解析出来后就是空字符串。
这种情况下不会报错,只是解析第一个对象的时候没有问题,解析第二个String拿到的就是空字符串。
2
3
4
[/code]
传入的参数:
解析出来的参数:
2
[/code]
2
3
[/code]
传入的参数:
解析出来的参数:
2
[/code]
1. 封装对象,把要传的多个参数封装成一个对象传入
2. 在访问路径中嵌入变量,使用@PathVariable注解,在请求路径中写 “/demo/{1}/{2}”,然后在请求路径中相应的位置替换为要穿的参数即可,这种也只适用于包装类,如String。
3. 改变请求的content type,使用
2
3
4
[/code]
请求时,header参数要修改
2
[/code]
请求Body中使用form形式
[/code]
然后就可以正确解析到两个参数的值
解析出来的参数:
2
[/code]
结论:
restful风格的接口不支持多个参数注:本文指的是通过json序列化参数的情况
1. 前置
一个定义用来测试的MyParam类public class MyParam { private String str; private Integer integer; // 省略 getter和setter…… }1
2
3
4
5
[/code]
我在做测试的是用了Chrome的插件
Advanced REST client,可以模拟浏览器发送各种请求,并自定义header和body。
测试的时候需要使用post方式,并在http请求header中加入
accept: application/json content-type: application/json1
2
[/code]
然后在htpp请求的Body中,输入json格式的参数,如
{"str":"bb","integer":3}。
以下是几种多参数接口的形式,以及输入参数,以及解析结果。
2. 第一种:两个String参数
@POST @Path("demo") public Result function(String param1, String param2);1
2
3
[/code]
传入的参数:
{"param1":"bb","param2":"cc"}
解析出来的参数:
param1: "{"param1":"bb","param2":"cc"}" param2: ""1
2
[/code]
这样的风格,传输过来的参数,读取的时候会读取request body中的inputStream,然后两个参数循环解析,解析完第一个参数的时候,会关闭inputStream,第二个参数再去读取inputStream的时候,读取到的就是空。
这样的话,传入的参数全部会赋值给第一个String对象,而第二个String解析出来后就是空字符串。
3. 第二种:一个对象参数,一个String参数
对于 第一个参数是封装对象的情况,能解析出来第一个对象,而第二个参数也是拿不到。这种情况下不会报错,只是解析第一个对象的时候没有问题,解析第二个String拿到的就是空字符串。
@POST @Path("demo") @Consumes({MediaType.JSON}) public Result function(MyParam myParam, String param);1
2
3
4
[/code]
传入的参数:
{"str":"helo","integer":2},"string":"test"
解析出来的参数:
param1: 能正确解析对象myParam,其两个属性能正确赋值。 param2: ""1
2
[/code]
4. 第三种:一个String参数,一个对象参数
如果把两个参数的位置交换,则会把传入的参数全部解析给第一个String,而解析第二个对象的时候,由于拿到的数据是空,所以会报错。如下:@POST @Path("demo") public Result function(String param, MyParam myParam);1
2
3
[/code]
传入的参数:
{"str":"helo","integer":2},"string":"test"
解析出来的参数:
param1: "{"str":"helo","integer":2},"string":"test"" param2: 会报错1
2
[/code]
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);1
2
3
4
[/code]
请求时,header参数要修改
accept: application/json content-type: application/x-www-form-urlencoded1
2
[/code]
请求Body中使用form形式
string1=wo&string2=kan1
[/code]
然后就可以正确解析到两个参数的值
解析出来的参数:
string1: wo string2: kan1
2
[/code]
<link rel="stylesheet" href="http://csdnimg.cn/release/phoenix/production/markdown_views-d4dade9c33.css"> </div>
相关文章推荐
- Restful接口传入多参数的问题和解决方案
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- spring mvc 传入中文参数乱码问题解决
- JAVA(Spring mvc)接口实现类 接收参数时出现 For input string: ""问题
- spring mvc 3.1的自动注入参数遇到的问题
- Jersey写Restful接口获取参数的问题
- SQLPLUS中,多次调用需传入参数的SQL文件时,要注意变量赋值的问题
- javascript 判断传入参数及传入数字串,不能获取全部的问题
- spring mvc4 配置restfulAPI 接口管理工具问题整体
- Spring MVC 参数包含中文会导致乱码的额问题,解决方案
- POST形式 soapUI调用WebService的restful接口,传入json参数,并且返回json
- Spring MVC 传入List参数的接收问题
- Jersey写Restful接口获取参数的问题
- ajax请求jesery接口无法获取参数的问题解决方案
- C++ 动态加载库链接传入的类变量中的接口报undefined symbol问题
- MyBatis传入多个参数的问题
- rosb笔记:bug时间:环境变量设置问题——“解决 roscd beginner_tutorials 没有此文件的问题”
- JAVA_OA(十四):SSM练手项目bug-JSP页面传递参数的编码问题
- 我的第一个webservice接口遇到的问题
- 编写批处理文件时传入多个参数的问题