一、问题
在接口测试工具中,常常要传入参数,初学者–也就是我菜鸡经常传错参数,不明白在Query还是Body里面传参,以及测试工具(AxxPoxx)测试下载接口的时候为什么发送数据成功却没有下载文档下来
后端参数传输方式
二、解决
query | body |
---|---|
get,post。query参数拼接在地址上 | post |
注意:params只能是一个字符串,不能传递对象类型的参数 | 若参数涉及传递对象,要用body |
可以先看看http常见的请求方式
在get请求中陈晨辰呀
划重点!!!!get请求中—
但是注意!!get请求中,如果使用注解@RequestParam要注意设置required=false来处理如果传参为空的情况
含义:该参数是可传可不传的,修改require属性为false。默认为true,意思则是,必须要传该参数的值(该参数不可为空)
一般来说get请求中参数不加注解就默认表示传参可以为空
常用组合:
post ,put -----@requestBody
get ----- 无参数、@requestParam
delete ------@pathVariable
(1)在数据中使用占位符(如需要传入的参数在数据库中使用的话)就可以获得;
(2)直接使用getParameter就可以获得前端传来的参数
更多用法参考站长严长生
2.直接在地址栏上传入参数
使用@PathVariable注解:接收请求路径中占位符的值
上面的HttpServletRequest方式改成这种方式为:
@RequestMapping(value="/history/updateType/{user_id}/{type}")
public Object updateType(@PathVariable("user_id")String userId,@PathVariable("type")String type)
在访问接口地址的时候直接将要传入的参数放在占位符的位置即可。如上面接口访问,请求路径为
http://localhost:8080/history/updateType/001/1
注意:使用@RequestParam也可以直接在地址栏上输入传入的参数,只是路径变为http://localhost:8080/history/updateType?user_id&type=1
代码中的请求路径为
3.@RequestParam()
传多个参数的时候,在每个传入的参数前面加上注解@RequestParam()即可。
下面我不确定,只是在某个应用场景的时候用到了—需要配合使用post,但是post多用来inset,而不是query,所有一般来说如果请求方式是get的话就可以直接写多个参数而不用加注解
@RequestParam()还有个功能,就是能保证如果传参为空不会报错,因为@RequestParam()能让传参为空有默认值/不设默认值也不会出错.
另外它的参数value:可以让前后端的传参名保持一致,Archie_java
value:请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。比如上图中第一个参数如果不设置value=“page”,则前端传入的参数名必须为pageNum,否则在后台接口中pageNum将接收不到对应的数据
我们可以看注解的默认设置
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
@AliasFor("name")
String value() default "";
@AliasFor("value")
String name() default "";
boolean required() default true;
String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
4.使用@RequestBody如何传入多个参数
受益匪浅justry_deng
(1)首先要知道 @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);
(2)@RequestBody一般使用post方式提交。并且
一个请求,只有一个RequestBody,但是可以有多个RequestParam
(3)那么问题是,只有一个RequestBody的时候,当我想要前端传过来多个参数怎么办?
先来看一个参数
再来看多个参数
5.@RequestParam,@PathParam,@PathVariable等注解区别
简短有力一年e度的夏天
@RequestParam与@PathVariable区别
清晰明了古柏树下
@RequestParam 与 @PathVariable的用例起床Oo
抓重点:
@RequestParam和@PathVariable都能够完成类似的功能——因为本质上,它们都是用户的输入,只不过输入的部分不同,一个在URL路径部分,另一个在参数部分。
要访问一篇博客文章,这两种URL设计都是可以的:
通过@PathVariable,例如/blogs/1
通过@RequestParam,例如blogs?blogId=1
那么究竟应该选择哪一种呢?建议:
(1)当URL指向的是某一具体业务资源(或者资源列表),例如博客,用户时,使用@PathVariable
(2)当URL需要对资源或者资源列表进行过滤,筛选时,用@RequestParam
例如我们会这样设计URL:
/blogs/{blogId}
/blogs?state=publish而不是/blogs/state/publish来表示处于发布状态的博客文章
测试接口工具如何使用下载类的接口
如接口实现的是下载excel表,那么使用流将路径在测试工具中使用发现没有返回结果。其实只需要把地址路径复制粘贴至浏览器中即可下载。
三、歉意
我是在学习的过程中遇到的对我有帮助的博文就放链接至我的博文上,记录问题以防走丢。若侵权请联系我。我一定配合。感谢。
补充:平常自己写代码的时候的小小备注
我总结的不好,看到这个人讲的是我平常遇到的问题我才不是你的谁
划重点:
情况一:原因是由于头文件类型不对,可以在MediaType中选择合适的类型,例如GET和POST
情况二:jquery提交delete时,不支持@RequestParam,只支持@PathVariable形式
情况三:若api在调用的时候,如果存在重类型,但不重名;例如:/id与/name,两者在类型上是一样的
情况四:这里提示Required String parameter ‘XXX’ is not present并不一定是XXX的错,也有可能是后面的参数错误。总的来说就是页面传递的参数和后台接受参数名自不匹配。
情况五:传递的参数里面包含特殊符号,比如前台传递字符串不能包含逗号等。(待证明)
情况六:传的参数是undefined;
补充:
常见错误码