@RequestParam和@RequestBody区别

@RequestParm用于绑定HTTP请求参数,可以是多个参数,也可以是一个Map集合,GET,POST均可@RequestParm中name属性是指定参数名,required属性默认为ture,表示必传。若为false则为非必传。属性有defaultValue默认值选项,若该参数为null时,会将默认值填充到参数上。

@RequestParm相当于整合下面俩个方法的功能:

request.getParamter(String s)
该方法和上面的注解功能相同,也是用来获取get或post方式传递的参数值,输出结果为String类型

request.getParamterMap()
该方法是获取get或post提交的所有参数,并转为一个map,key是String类型,value是String数组,用来保存相同key的所有value。

@RequestParm支持POST,GET请求
只支持Content-Type: 为 application/x-www-form-urlencoded编码的内容。Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

@RequestBody绑定一个对象实体

不支持get请求,因为get请求没有HttpEntity。必须要在请求头中申明content-Type(如application/json).springMvc通过HandlerAdapter配置的HttpMessageConverters解析httpEntity的数据,并绑定到相应的bean上
只能一个@RequestBody。可以与@RequestParam一起使用,但建议最好不要与@RequestParam一起使用,是因为@RequestBody会将InputStream吃掉,造成后面的@RequsetParam无法匹配到参数而报400

关于上述俩个注解的使用,我觉得有必要了解一下Form Data 和 Request Payload的区别;
前端开发中经常会用到AJAX发送异步请求,对于POST类型的请求会附带请求数据。而常用的两种传参方式为:Form Data 和 Request Payload

@RequestParam和@RequestBody区别_第1张图片
@RequestParam和@RequestBody区别_第2张图片

GET请求
使用get请求时,参数会以key=value的形式拼接在请求的url后面。例如:
但是受限于请求URL的长度限制,一般参数较少时会使用get请求。

POST请求
当参数数量较多,且对数据有一定安全性要求时,会考虑用post请求传递参数数据。POST请求的参数数据是在请求体中。

方式一: Form Data形式
当POST请求的请求头里设置Content-Type: application/x-www-form-urlencoded(默认), 参数在请求体以标准的Form Data的形式提交,以&符号拼接,参数格式为key=value&key=value&key=value…

前端代码设置:

在servlet中,后端可以通过request.getParameter(name)的形式来获取表单参数。

方式二:Request Payload形式
如果使用AJAX原生POST请求,请求头里设置Content-Type:application/json,请求的参数会显示在Request Payload中,参数格式为JSON格式:{“key”:“value”,“key”:“value”…},这种方式可读性会更好。

后端可以使用getRequestPayload方法来获取。

Form Data 和 Request Payload 区别
如果请求头里设置Content-Type: application/x-www-form-urlencoded,那么这个请求被认为是表单请求,参数出现在Form Data里,格式为key=value&key=value&key=value…

原生的AJAX请求头里设置Content-Type:application/json,或者使用默认的请求头Content-Type:text/plain;参数会显示在Request payload块里提交

在SpringMVC里面@RequestParam和@RequestBody的区别就是根据这个来的,当我们通过Ajax进行数据传输的时候,如果前端HTTP请求的Body体传输的Form Data那么后端就可以通过@RequestParam来进行接收,这种对应的Content-Type’: ‘application/x-www-form-urlencoded’,,如果是Request Payload,那么对应Content-Type:application/json,这个时候如果使用@RequestParam来接收的后端会无法识别到参数,会报400的错误,这个时候需要使用@RequestBody来接收.

你可能感兴趣的:(SpringMVC)