@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/qq_43842093/article/details/121312409

发起一次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());}
12345678910@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;}
1234567

在这里插入图片描述
后台打印结果:

name:zhangsan,qqq
age:90
12
  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());
}
12345678910

控制层代码同上
前端传参同上

后台打印结果:

name:zhangsan
age:90
12
  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值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@RequestBody的使用

提示:建议一定要看后面的RequestBody的核心逻辑源码以及六个重要结论本文前半部分的内容都是一些基 本知识常识,可选择性跳过。 声明:本文是基于SpringBoot,进行的演示说明。 基础知识介绍: ​ RequestBody主要用来接…

@RequestBody 和 @RequestParam可以同时使用

RequestParam和RequestBody这两个注解是可以同时使用的。 网上有很多博客说RequestParam 和RequestBody不能同时使用,这是错误的。根据HTTP协议,并没有说post请求不能带URL参数,经验证往一个带有参数的URL发送post请求也是可以成功的。只不过…

mysql索引使增删变慢_mysql优化之索引篇

mysql,对it打工人,这个几乎是必备的技能之一。mysql可以解决我们平时工作中的大量的、有关增删查改的问题。所以想深入了解mysql,我觉得关键在于他的增删查改背后的算法,开搞。面对增删查改等问题,直接通过场景来看吧场…

POST、GET、@RequestBody和@RequestParam区别

RequestParam 注解RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中。 RequestParam可以接受简单类型的属性,也可以接受对象类型。 RequestParam有三个配置参数: required 表示是否必须,默认为 true,必须。de…

centos安装mysql卡住_CentOS 6.4安装MySQL的过程中出现的bug

在CentOS 6.4下安装MySQL,下载一个源码包,感觉很简单,tar,./configure,make,make install 经典四步,弄这个也不是第一次了,但今天就是老出错,首先是./configure中&#x…

SpringMVC接受List的几种方式

说到SpringMVC接受List参数,可能有人会说这个是个坑!下面我来跟大家说怎么补这个坑。下面我分几种情况来讲: 一、只接收一个List 1、form表单提交 controller代码: ResponseBody RequestMapping("test") public voi…

mysql怎么加固_mysql安装及加固

mysql安装查看是否安装mysql我们先看一下有没有安装mysqlyum list installed mysql | grep mysql本地只安装了php链接mysql的库,没有安装mysql如果有安装,可以使用安装的或者卸载了重新安装添加yum源去mysql官网查找下面我就来安装下yum源sudo rpm -ivh …

RabbitMQ保姆级教程

文章目录 前言一、MQ是什么? 1.1 AMQP 二、在Linux安装RabbitMQ 2.1 安装2.2 RabbitMQ启动命令2.3 开启RabbitMQ 后台管理界面 2.3.1 登录rabbitMQ UI界面 2.3 Docker启动RabbitMQ2.4 常见消息模型2.5 生产者(Producer) / 消费者(Consumer)2.6 工作队列模式(Work Q…

spring mysql 连接池配置_SpringBoot数据库连接池常用配置

关注公众号:程序猿王国 持续更新,每日分享在配置文件中添加配置如下(我使用的是多数据源):spring.datasource.primary.urljdbc\:mysql\://localhost\:3306/test?useUnicode\true&characterEncoding\utf-8spring.datasource.prim…

交换机到底是啥?

1、交换机 交换机个人资料: 1.证件照 注:copy 百度百科 我的博客/交换机到底是啥? 这东西乍一看有点像月光宝盒,是不是。 2.个人简介 交换机(Switch)意为“开关”是一种用于电(光&#xff0…

unity3d 动态合批设置_Unity3D SkinnedMeshRenderer合批优化

最近做了性能优化相关的工作,其中一些是关于战斗模块的渲染的。主要是对场景中使用的基于SkinnedMeshRenderer的网格进行了一些合批优化(降DC),记录如下。项目使用的Unity版本为5.6.4p1。游戏中的战斗模块是这样的:战斗逻辑由服务器承担&…

java类的加载顺序_java类加载先后顺序

这里讲的不是类加载机制,是类的加载先后顺序。话不多说了,先设定以下场景:package com.jingdong;public class A {public static void main(String[] args){System.out.println(Ib.b);B bnew B();b.ibTest();}}public class B implements Ib{private D d;private C …

MyBatis:模糊查询的4种实现方式

1、根据姓名模糊查询员工信息 1.1、方式一 步骤一:编写配置文件 步骤二:测试 步骤三:分析 此种方式需要在调用处手动的去添加“%”通配符。 1.2、方式二 说明: 使用方式一可以实现模糊查询,但是有一点不方便的地…

java 阻塞 socket_java socket非阻塞I/O

1 非阻塞(Nonblocking)体系结构在这一部分,我将从理论的角度来解释非阻塞体系的结构及其工作原理。这部“喜剧”(当然,如果你喜欢的话也可以称做戏剧)的“人物”如下:●服务器端:接收请求的应用程序。●客户端:向…

java mod函数的使用方法_java 数学计算的具体使用

java.lang.Math 库提供了常用的数学计算工具常量final double E 2.7182818284590452354; // 自然对数底数final double PI 3.14159265358979323846; // 圆周率final double DEGREES_TO_RADIANS 0.017453292519943295; // 角度转弧度final double RADIANS_TO_DEGREES 57.295…

java的debug模式_java第六章:debug模式介绍及大量实例练习

1.Debug模式1.1什么是Debug模式【理解】是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序。1.2Debug模式操作流程【应用】如何加断点选择要设置断点的代码行,在行号的区域后面单击鼠标左键即…

注解RequestMapping中的URI路径最前面到底需不需要加斜线?

注解RequestMapping中的URI路径最前面到底需不需要加斜线? 您有没有这样的困惑:在协同开发过程中,使用RequestMapping,或者是GetMapping,或者是PostMapping这类注解时,有的程序员加了斜线,有的程序员没有…

java ajax jquery分页插件_jquery ajax分页插件的简单实现

说到基于jQuery的ajax分页插件,那我们就先看看主要的代码结构:1、首先定义一个pager对象:var sjPager window.sjPager {opts: {//默认属性pageSize: 10,preText: "pre",nextText: "next",firstText: "First"…

java thrift连接池_由浅入深了解Thrift之客户端连接池化

一、问题描述在上一篇《由浅入深了解Thrift之服务模型和序列化机制》文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点。如今的互联网圈中,RPC服务化的思想如火如荼。我们又该如何将thrift服务化应用到我们的项目中哪?实现thrif…

Vue 进阶组件实战应用 -- 父子组件传值的应用实例(子父组件传值的两种触发方式)

基础的子组件和父组件通信已经搞定了,可以看此博客 父子组件传值基础应用 需求 现在需求是在一个父页面引用子组件,不只是要实现基本的父子组件传值。并且子组件给父组件传值的触发条件要在父页面触发。 目前小编采用的方式是使用ref 属性this.emit 方法…