基于@RequestParam与@RequestBody使⽤对⽐
⽬录
@RequestParam与@RequestBody对⽐
@RequestParam
@RequestBody
@requestBody与@requestparam;@requestBody的加与不加的区别
⼀、⾸先说明@requestBody与@requestParam的区别
⼆、Content-Type
三、问题,@requestBody到底在什么时候写与不写呢
JQuery的$.ajax(url,[settings])
@RequestParam与@RequestBody对⽐
@RequestParam
⽤来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。
(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)
RequestParam可以接受简单类型的属性,也可以接受对象类型。
实质是将Parameter() 中的Key-Value参数Map利⽤Spring的转化机制ConversionService配置,转化成参数接收对象或字段。
在Content-Type: application/x-www-form-urlencoded的请求中,
get ⽅式中queryString的值,和post⽅式中 body data的值都会被Servlet接受到并转化到Parameter()参数集中,所以@RequestParam可以获取的到。  代码⽰例:
@GetMapping("/test-sentinel-resource")
public String testSentinelResource(@RequestParam(required = false) String a) {
if (StringUtils.isBlank(a)) {
throw new IllegalArgumentException("a cannot be blank.");
}
return a;
}
当 required = false 时,a参数为可为空,当 required= true时,a参数不可为空。
@RequestBody
⼀般⽤来处理⾮Content-Type: application/x-www-form-urlencoded编码格式的数据。
GET请求中,因为没有HttpEntity,所以@RequestBody并不适⽤。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使⽤HandlerAdapter 配置的HttpMessageConverters来
解析HttpEntity中的数据,然后绑定到相应的bean上。
就application/json类型的数据⽽⾔,使⽤注解@RequestBody可以将body⾥⾯所有的json数据传到后端,后端再进⾏解析。
GET请求中,因为没有HttpEntity,所以@RequestBody并不适⽤。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使⽤
HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。
@PostMapping("/create/user")
public UserInfo createUser(@RequestBody CreateUserRequest request) {
ateUser(request);
}
⼩结⼀下:
1. form-data、x-www-form-urlencoded:不可以⽤@RequestBody;
2. application/json:json字符串部分可以⽤@RequestBody;url中的?后⾯参数可以⽤@RequestParam
3. get请求中不能⽤@RequestBody注解
@requestBody 与@requestparam;@requestBody的加与不加的区别
⼀、⾸先说明@requestBody与@requestParam的区别
spring的RequestParam注解接收的参数是来⾃于requestHeader中,即请求头。都是⽤来获取请求路径(url )中的动态参数。也就是在url中,格式为xxx? username=123&password=456。功能与@pathvarible。
RequestBody注解接收的参数则是来⾃于requestBody中,即请求体中。
知识点:
⼆、Content-Type
内容类型,⼀般是指⽹页中存在的Content-Type,⽤于定义⽹络⽂件的类型和⽹页的编码,决定浏览器
将以什么形式、什么编码读取这个⽂件,这就是经常看到⼀些Asp ⽹页点击的结果却是下载到的⼀个⽂件或⼀张图⽚的原因。
三、问题,@requestBody到底在什么时候写与不写呢
看现象如下:发现ajaxDate有若⼲种写法。
(1)直接写名传参。如下:
打印ajaxDate如下格式:
为什么要用ajax虽然打印结果是json对象式,但最后会转为key1=value1&key2=value2的格式提交到后台,不需要加@requestBody。
(2)serializeble实例化表单
打印结果如下:
表单格式使⽤的是默认的ContentType类型application/x-www-form-urlencoded,格式为key1=value1&key2=value2提交到后台,不需要加@requestBody。(3)contentType转化之后,需要加@requestBody,controller才能接收到数据。
ajaxDate打印结果如下:
post和get功能相同。
前台将ajaxData转为json字符串,后台必须加@RequestBody注解的属性才能⾃定映射到值。
为什么有的需要加@requestBody,有的不需要。加与不加的区别如下:
使⽤@requestBody.当请求content_type为:application/json类型的请求,数据类型为json时, json格式如下:{"aaa":"111","bbb":"222"}
不使⽤@requestBody.当请求content_type为:application/x-www-form-urlencoded类型的或multipart/form-data时,数据格式为aaa=111&bbb=222。JQuery的$.ajax(url,[settings])
1.默认的ContentType的值为:application/x-www-form-urlencoded; charset=UTF-8 此格式为表单提交格式,数据为key1=value1&key2=value2的格式。图⼆serrializeble,只⽤的是默认contentType类型。
2.虽然ajax的data属性值格式为:{key1:value1,key2:value2},但最后会转为key1=value1&key2=value2的格式提交到后台。
图⼆,虽然打印出的结果是不是&格式的,但是会转化。
3.如果ajax要和springmvc交互,要使⽤key1=value1&key2=value2的格式,后台springmvc只需要定义对象或者参数就⾏了,会⾃动映射。
4.如果springmvc的参数有@RequestBody注解(接收json**字符串**格式数据),ajax必须将date属性值转为json字符串,不能为json对象(js对象,会⾃动转为key=value形式)。并且,修改contentType的值为:application/json; charset=UTF-8,这样加了@RequestBody注解的属性才能⾃定映射到值。
5.使⽤在进⾏图⽚或者⽂件上传时使⽤ multipart/form-data 类型时、数据会⾃动进⾏映射不要添加任何注解。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。