@requestbody和@requestparam到底什么作用
1、什么都不写
GET
可以自动封装为对象模型,没有的数值自动为0值
POST
请求体里面放了数据,但是还是使用了RequestParam里的数据
总结:
在不使用注解的情况下,相当于默认使用了RequestParam里的数据 (这种理解是错误的,真实的原因参考下面段落 有一个有趣的现象 ),而且可以自动封装为对象模型,没有的数据也不会报错,而是设为0值
post请求时,如果不使用 contentType:'application/json;charset=utf-8'
,参数还是可以在RequestParam里获取,所以也可以封装为对象模型。
2、使用@RequestParam
GET POST
结果都是400:Required Student parameter ‘student’ is not present
使用@RequsetParam时,无法封装对象模型,只能接受简单数据类型(String int 等)。
值得注意的是如果使用@RequestParam(required = false),在没有对应数据时不会报400错误,而是赋为0值。
3、使用@RequestBody
GET
结果400:The request sent by the client was syntactically incorrect.
使用get请求没有请求体,而使用@RequestBody获取的肯定是请求体里的数据
POST
结果415:The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
因为Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型。使用@RequestBody必须使用 contentType:'application/json;charset=utf-8'
,且只能是post请求。
结果:{“name”:“lisi”,“no”:“001”,“age”:12}
将Content-Type手动设置为json格式,可以把请求体里的json字符串,读出来封装为对象模型。
总结
不写注解,默认使用RequestParam里的数据,而且没有的话也不报错,读为0值;
@RequestParam使用的是RequestParam里的数据。key和变量名必须一致,否则报错。无法封装对象模型接受参数;
@RequestBody使用的是请求体里的数据,必须使用json格式,需要在请求体里面设置Content-Type:application/json;
结果:{“name”:“zhangsan”,“no”:“001”,“age”:12}
使用了RequestParam的name,RequestBody的no和age。
另外
结果与上方一致。{“name”:“zhangsan”,“no”:“001”,“age”:12}
因为url路径后面的值都会被Servlet接受到并转化到Request.getParameter()参数集中(HttpServletRequest request),所以@RequestParam可以获取的到。即request.getParameter(" ")能得到的数据使用@RequestParam也可以得到
-----------------分割线------------------------------------------------------------------------------
之前理解的太片面。工作中有遇到了上面结论解释不了的情况,使用post请求,但是参数能从RequestParam里面获取。不得不再次开始查资料。
首先应该理解:Query String Parameters、Form Data、Request Payload的区别
参考:https://blog.csdn.net/c_liufeng/article/details/89228115
发起一次POST请求时,若未指定content-type,则默认content-type为application/x-www-form-urlencoded。即参数会以Form Data的形式进行传递,不会显式出现在请求url中。请求参数将被放置于request.paramter,解析成map。在控制台看到,数据就是在Form Data中。form表单中数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式为application/x-www-form-urlencoded)。
所以url、Query String Parameters、Form Data里的参数都可以通过@RequestParam或者request.getParameter(" ")获取。
@RequestBody
@RequestBody是将post请求中内容转为一个整体对象。
@RequestBody的解析有两个条件:
- POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组);
contentType:'application/json;charset=utf-8'
- @RequestBody注解的参数类型必须是完全可以接收参数值的类型,比如:Map,JSONObject,或者对应的JavaBean;
所以Integer类型不能作为@RequestBody注解的参数类型
@RequestParam
这种方式只用在Content-Type=application/x-www-form-urlencoded这种情况下才能使用,sevlet将Body中的key-value转成Param。
有一个有趣的现象
- 如果Content-Type=application/x-www-form-urlencoded,url和body中有相同的属性名。如果是String类型,则两个值会被拼接,其他类型取的是URL拼接的参数。
$.ajax({type: "post",contentType: "application/x-www-form-urlencoded",url: "xhh/add.do?name=zhangsan&age=90",data: data.field,dataType: "json",success: function (data) {alert(data.toString());}
@RequestMapping(value = "/add.do", method = {RequestMethod.POST})public String test(@RequestParam("name") String name,@RequestParam("age") int age){System.out.println("name:" + name);System.out.println("age" + age);return name;}
后台打印结果:
name:zhangsan,qqq
age:90
- 如果Content-Type=mutipart/form-data,Body中加入参数和URL后面拼接参数一起做Post请求,都可以被加载到Param中,如果是同名的,只取用form-data中的。
$.ajax({type: "post",
contentType: "mutipart/form-data",
url: "xhh/add.do?name=zhangsan&age=90",
data: data.field,
dataType: "json",
success: function (data) {alert(data.toString());
}
控制层代码同上
前端传参同上
后台打印结果:
name:zhangsan
age:90
- get请求,结果与上面2个并不完全相同,至于是获取url数据还是Query String Parameters里数据,还是拼接,具体情况再具体测吧,总之避免这种情况出现最好。
application/x-www-form-urlencoded : 表单中默认的ContentType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
通用HttpServletRequest
和Get方式一样,这是个通用的方式。这个也可以和URL拼接的一起搭,但是没有RequestParam的String类型值被拼接问题,优先级 form-data高于URL拼接高于x-www-form-urlencoded。
参考:https://blog.csdn.net/qq_43194157/article/details/107617370
后端如果用springMVC的@RequestBody注解的话,则只能接收Json对象的字符串,不能接收Json对象,用 JSON.stringify(data)的方式将对象变成字符串,同时ajax请求也要指定dataType: “json”,contentType:“application/json” ,这样就能用@RequestBody注解绑定对象或者List集合.
参考:https://blog.csdn.net/weixin_38676276/article/details/87630740
这次得出的结论:
1.@RequestBody只能用来接受Json格式的字符串,前端必须使用 contentType:'application/json;charset=utf-8'
,必须是post请求。
2.@RequestParam或者没有注解获取的都是requestParam(除了contentType:'application/json;charset=utf-8'
时,其他情况下参数都会被封装在requestParam里。如果url和body里面都有重名的参数,参考 有一个有趣的现象 那里)里的数据。不管是对象模型里的属性(即使用对象模型接收参数的时候),还是基本数据类型都一样。
区别是没有注解的情况下相当使用了@RequestParam(required = false) ,不传不会报错,给0值。
@requestbody和@requestparam到底什么作用相关推荐
- POST、GET、@RequestBody和@RequestParam区别
@RequestParam 注解@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中. RequestParam可以接受简单类型的属性,也可以接受对象类型. ...
- 详解get与post请求方式、content-type与responseType、@Requestbody与@Requestparam的使用场景
一. get与post请求方式 post:一般用来提交表单,请求数据被包装在body体中,是安全的: get:一般用来获取数据信息,当然也可以用来获取表单,请求参数在url中,是不安全的: 二. co ...
- @RequestBody、@RequestParam、@PathVariable
@RequestBody.@RequestParam.@PathVariable RequestParam 后端接收 可以设置默认值@RequestParam(value="currentp ...
- @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解
后端接收前端传的参数主要有两种方式: 第一种: 用变量来接收,前端传递的参数会对相同变量名进行赋值. 第(1)种: @GetMapping("/info/{id}")public ...
- @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解的使用及区别
@RequestBody @RequestBody 主要用来接收前端传递给后端的 json 字符串中的数据(请求体中的数据): Get 方式无请求体,所以使用 @RequestBody 接收数据时,前 ...
- @requestbody和@requestparam作用
1.什么都不写 GET 可以自动封装为对象模型,没有的数值自动为0值 POST 请求体里面放了数据,但是还是使用了RequestParam里的数据 总结: 在不使用注解的情况下,相当于默认使用了Req ...
- @RequestBody 和 @RequestParam可以同时使用
@RequestParam和@RequestBody这两个注解是可以同时使用的. 网上有很多博客说@RequestParam 和@RequestBody不能同时使用,这是错误的.根据HTTP协议,并没 ...
- python的类作用_python——类中的self到底的作用及三个应用场景
class Test(object): def __init__ (self, val1): self.val0 = val1 def fun1(self): print(self.val0) def ...
- @RequestBody、@RequestParam、@Param 的详解
最新文章
- 深入浅出神经网络的改进方法!
- 阿里平头哥首款CPU芯片发布!5nm倚天710,128核单片600亿晶体管,无人能与争锋...
- .net引用System.Data.SQLite操作SQLite
- 基于Node的Koa2项目从创建到打包到云服务器指南
- java io删除文件_java IO 文件操作方法总结
- 记录一次react项目配置过程
- 【微信开发】上传下载多媒体文件
- iscsi多路径配置方式
- 新手建网站笔记(四)--快捷键
- javaIO流实现文件拷贝
- 路由器刷openwrt
- —— GPS测量原理及应用复习-1 ——
- vue react 写法区别
- 重阳节,让我们祝天下的老年人生活幸福快乐。
- [P4V]Perforce(P4V)使用教程
- 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。七 (上)之异常订单 后台功能完善...
- 全球认可的PMI认证体系
- 我们的秘密是绿色的!他喵的
- Ajax实现网页部分更新
- mysql表如何删除一条数据_mysql如何删除表中一行数据?
热门文章
- [转载] c++多态与java多态性_Java中的多态性
- [转载] java注释
- kotlin 查找id_Kotlin程序查找立方体区域
- C#Convert.ToInt32(char)方法-将char值转换为int
- java分数表示_表示Java分数的最佳方法?
- 编程语言难度排名_编程语言TOP10!该如何选择适合自己的?
- 递归转化成非递归过程_8086微处理器中的递归和重入过程
- entity framework使用技巧
- vc给exe更改图标
- lru调度算法例题_嵌入式必会!C语言最常用的贪心算法就这么被攻略了