@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/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的解析有兩個條件:
所以Integer類型不能作為@RequestBody注解的參數類型
@RequestParam
這種方式只用在Content-Type=application/x-www-form-urlencoded這種情況下才能使用,sevlet將Body中的key-value轉成Param。
有一個有趣的現象
后臺打印結果:
控制層代碼同上
前端傳參同上
后臺打印結果:
name:zhangsan age:90application/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到底什么作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中和、||和|的区别?
- 下一篇: python3的3D实战 -基于pand