@requestbody和@requestparam到底什么作用
1、什么都不寫(xiě)
GET
可以自動(dòng)封裝為對(duì)象模型,沒(méi)有的數(shù)值自動(dòng)為0值
POST
請(qǐng)求體里面放了數(shù)據(jù),但是還是使用了RequestParam里的數(shù)據(jù)
總結(jié):
在不使用注解的情況下,相當(dāng)于默認(rèn)使用了RequestParam里的數(shù)據(jù) (這種理解是錯(cuò)誤的,真實(shí)的原因參考下面段落 有一個(gè)有趣的現(xiàn)象 ),而且可以自動(dòng)封裝為對(duì)象模型,沒(méi)有的數(shù)據(jù)也不會(huì)報(bào)錯(cuò),而是設(shè)為0值
post請(qǐng)求時(shí),如果不使用 contentType:'application/json;charset=utf-8',參數(shù)還是可以在RequestParam里獲取,所以也可以封裝為對(duì)象模型。
2、使用@RequestParam
GET POST
結(jié)果都是400:Required Student parameter ‘student’ is not present
使用@RequsetParam時(shí),無(wú)法封裝對(duì)象模型,只能接受簡(jiǎn)單數(shù)據(jù)類(lèi)型(String int 等)。
值得注意的是如果使用@RequestParam(required = false),在沒(méi)有對(duì)應(yīng)數(shù)據(jù)時(shí)不會(huì)報(bào)400錯(cuò)誤,而是賦為0值。
3、使用@RequestBody
GET
結(jié)果400:The request sent by the client was syntactically incorrect.
使用get請(qǐng)求沒(méi)有請(qǐng)求體,而使用@RequestBody獲取的肯定是請(qǐng)求體里的數(shù)據(jù)
POST
結(jié)果415:The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
因?yàn)镠ttp協(xié)議中,如果不指定Content-Type,則默認(rèn)傳遞的參數(shù)就是application/x-www-form-urlencoded類(lèi)型。使用@RequestBody必須使用 contentType:'application/json;charset=utf-8' ,且只能是post請(qǐng)求。
結(jié)果:{“name”:“l(fā)isi”,“no”:“001”,“age”:12}
將Content-Type手動(dòng)設(shè)置為json格式,可以把請(qǐng)求體里的json字符串,讀出來(lái)封裝為對(duì)象模型。
總結(jié)
不寫(xiě)注解,默認(rèn)使用RequestParam里的數(shù)據(jù),而且沒(méi)有的話(huà)也不報(bào)錯(cuò),讀為0值;
@RequestParam使用的是RequestParam里的數(shù)據(jù)。key和變量名必須一致,否則報(bào)錯(cuò)。無(wú)法封裝對(duì)象模型接受參數(shù);
@RequestBody使用的是請(qǐng)求體里的數(shù)據(jù),必須使用json格式,需要在請(qǐng)求體里面設(shè)置Content-Type:application/json;
結(jié)果:{“name”:“zhangsan”,“no”:“001”,“age”:12}
使用了RequestParam的name,RequestBody的no和age。
另外
結(jié)果與上方一致。{“name”:“zhangsan”,“no”:“001”,“age”:12}
因?yàn)閡rl路徑后面的值都會(huì)被Servlet接受到并轉(zhuǎn)化到Request.getParameter()參數(shù)集中(HttpServletRequest request),所以@RequestParam可以獲取的到。即request.getParameter(" ")能得到的數(shù)據(jù)使用@RequestParam也可以得到
-----------------分割線(xiàn)------------------------------------------------------------------------------
之前理解的太片面。工作中有遇到了上面結(jié)論解釋不了的情況,使用post請(qǐng)求,但是參數(shù)能從RequestParam里面獲取。不得不再次開(kāi)始查資料。
首先應(yīng)該理解:Query String Parameters、Form Data、Request Payload的區(qū)別
參考:https://blog.csdn.net/c_liufeng/article/details/89228115
發(fā)起一次POST請(qǐng)求時(shí),若未指定content-type,則默認(rèn)content-type為application/x-www-form-urlencoded。即參數(shù)會(huì)以Form Data的形式進(jìn)行傳遞,不會(huì)顯式出現(xiàn)在請(qǐng)求url中。請(qǐng)求參數(shù)將被放置于request.paramter,解析成map。在控制臺(tái)看到,數(shù)據(jù)就是在Form Data中。form表單中數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認(rèn)的提交數(shù)據(jù)的格式為application/x-www-form-urlencoded)。
所以u(píng)rl、Query String Parameters、Form Data里的參數(shù)都可以通過(guò)@RequestParam或者request.getParameter(" ")獲取。
@RequestBody
@RequestBody是將post請(qǐng)求中內(nèi)容轉(zhuǎn)為一個(gè)整體對(duì)象。
@RequestBody的解析有兩個(gè)條件:
所以Integer類(lèi)型不能作為@RequestBody注解的參數(shù)類(lèi)型
@RequestParam
這種方式只用在Content-Type=application/x-www-form-urlencoded這種情況下才能使用,sevlet將Body中的key-value轉(zhuǎn)成Param。
有一個(gè)有趣的現(xiàn)象
后臺(tái)打印結(jié)果:
控制層代碼同上
前端傳參同上
后臺(tái)打印結(jié)果:
name:zhangsan age:90application/x-www-form-urlencoded : 表單中默認(rèn)的ContentType,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認(rèn)的提交數(shù)據(jù)的格式)
通用HttpServletRequest
和Get方式一樣,這是個(gè)通用的方式。這個(gè)也可以和URL拼接的一起搭,但是沒(méi)有RequestParam的String類(lèi)型值被拼接問(wèn)題,優(yōu)先級(jí) form-data高于URL拼接高于x-www-form-urlencoded。
參考:https://blog.csdn.net/qq_43194157/article/details/107617370
后端如果用springMVC的@RequestBody注解的話(huà),則只能接收J(rèn)son對(duì)象的字符串,不能接收J(rèn)son對(duì)象,用 JSON.stringify(data)的方式將對(duì)象變成字符串,同時(shí)ajax請(qǐng)求也要指定dataType: “json”,contentType:“application/json” ,這樣就能用@RequestBody注解綁定對(duì)象或者List集合.
參考:https://blog.csdn.net/weixin_38676276/article/details/87630740
這次得出的結(jié)論:
1.@RequestBody只能用來(lái)接受Json格式的字符串,前端必須使用 contentType:'application/json;charset=utf-8' ,必須是post請(qǐng)求。
2.@RequestParam或者沒(méi)有注解獲取的都是requestParam(除了contentType:'application/json;charset=utf-8'時(shí),其他情況下參數(shù)都會(huì)被封裝在requestParam里。如果url和body里面都有重名的參數(shù),參考 有一個(gè)有趣的現(xiàn)象 那里)里的數(shù)據(jù)。不管是對(duì)象模型里的屬性(即使用對(duì)象模型接收參數(shù)的時(shí)候),還是基本數(shù)據(jù)類(lèi)型都一樣。
區(qū)別是沒(méi)有注解的情況下相當(dāng)使用了@RequestParam(required = false) ,不傳不會(huì)報(bào)錯(cuò),給0值。
總結(jié)
以上是生活随笔為你收集整理的@requestbody和@requestparam到底什么作用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JAVA中和、||和|的区别?
- 下一篇: @RequestParam 注解原理