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的解析有两个条件:

  1. POST请求中content的值必须为json格式(存储形式可以是字符串,也可以是byte数组); contentType:'application/json;charset=utf-8'
  2. @RequestBody注解的参数类型必须是完全可以接收参数值的类型,比如:Map,JSONObject,或者对应的JavaBean;
    所以Integer类型不能作为@RequestBody注解的参数类型
@RequestParam

这种方式只用在Content-Type=application/x-www-form-urlencoded这种情况下才能使用,sevlet将Body中的key-value转成Param。
有一个有趣的现象

  1. 如果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
  1. 如果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
  1. 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到底什么作用相关推荐

  1. POST、GET、@RequestBody和@RequestParam区别

    @RequestParam 注解@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中. RequestParam可以接受简单类型的属性,也可以接受对象类型. ...

  2. 详解get与post请求方式、content-type与responseType、@Requestbody与@Requestparam的使用场景

    一. get与post请求方式 post:一般用来提交表单,请求数据被包装在body体中,是安全的: get:一般用来获取数据信息,当然也可以用来获取表单,请求参数在url中,是不安全的: 二. co ...

  3. @RequestBody、@RequestParam、@PathVariable

    @RequestBody.@RequestParam.@PathVariable RequestParam 后端接收 可以设置默认值@RequestParam(value="currentp ...

  4. @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解

    后端接收前端传的参数主要有两种方式: 第一种: 用变量来接收,前端传递的参数会对相同变量名进行赋值. 第(1)种: @GetMapping("/info/{id}")public ...

  5. @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解的使用及区别

    @RequestBody @RequestBody 主要用来接收前端传递给后端的 json 字符串中的数据(请求体中的数据): Get 方式无请求体,所以使用 @RequestBody 接收数据时,前 ...

  6. @requestbody和@requestparam作用

    1.什么都不写 GET 可以自动封装为对象模型,没有的数值自动为0值 POST 请求体里面放了数据,但是还是使用了RequestParam里的数据 总结: 在不使用注解的情况下,相当于默认使用了Req ...

  7. @RequestBody 和 @RequestParam可以同时使用

    @RequestParam和@RequestBody这两个注解是可以同时使用的. 网上有很多博客说@RequestParam 和@RequestBody不能同时使用,这是错误的.根据HTTP协议,并没 ...

  8. python的类作用_python——类中的self到底的作用及三个应用场景

    class Test(object): def __init__ (self, val1): self.val0 = val1 def fun1(self): print(self.val0) def ...

  9. @RequestBody、@RequestParam、@Param 的详解

最新文章

  1. 深入浅出神经网络的改进方法!
  2. 阿里平头哥首款CPU芯片发布!5nm倚天710,128核单片600亿晶体管,无人能与争锋...
  3. .net引用System.Data.SQLite操作SQLite
  4. 基于Node的Koa2项目从创建到打包到云服务器指南
  5. java io删除文件_java IO 文件操作方法总结
  6. 记录一次react项目配置过程
  7. 【微信开发】上传下载多媒体文件
  8. iscsi多路径配置方式
  9. 新手建网站笔记(四)--快捷键
  10. javaIO流实现文件拷贝
  11. 路由器刷openwrt
  12. —— GPS测量原理及应用复习-1 ——
  13. vue react 写法区别
  14. 重阳节,让我们祝天下的老年人生活幸福快乐。
  15. [P4V]Perforce(P4V)使用教程
  16. 微擎 人人商城 对接京东vop 对接京东商品,同步商品 地址,库存,价格,上下架等。七 (上)之异常订单 后台功能完善...
  17. 全球认可的PMI认证体系
  18. 我们的秘密是绿色的!他喵的
  19. Ajax实现网页部分更新
  20. mysql表如何删除一条数据_mysql如何删除表中一行数据?

热门文章

  1. [转载] c++多态与java多态性_Java中的多态性
  2. [转载] java注释
  3. kotlin 查找id_Kotlin程序查找立方体区域
  4. C#Convert.ToInt32(char)方法-将char值转换为int
  5. java分数表示_表示Java分数的最佳方法?
  6. 编程语言难度排名_编程语言TOP10!该如何选择适合自己的?
  7. 递归转化成非递归过程_8086微处理器中的递归和重入过程
  8. entity framework使用技巧
  9. vc给exe更改图标
  10. lru调度算法例题_嵌入式必会!C语言最常用的贪心算法就这么被攻略了