@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

在這裏插入圖片描述
在這裏插入圖片描述

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來接收.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章