@RequestBody和@RequestParam區別
@RequestParam
註解@RequestParam接收的引數是來自HTTP請求體或請求url的QueryString中。
RequestParam可以接受簡單型別的屬性,也可以接受物件型別。
@RequestParam有三個配置引數:
required
表示是否必須,預設為true
,必須。defaultValue
可設定請求引數的預設值。value
為接收url的引數名(相當於key值)。
@RequestParam用來處理Content-Type
為application/x-www-form-urlencoded
編碼的內容,Content-Type
預設為該屬性,也可以接收application/json。@RequestParam也可用於其它型別的請求,例如:POST、DELETE等請求
所以在postman中,要選擇body的型別為x-www-form-urlencoded
,這樣在headers中就自動變為了Content-Type
:application/x-www-form-urlencoded
編碼格式。如下圖所示
但是這樣有個弊端不支援批量插入資料啊,如果改用json
字串來傳值的話,型別設定為application/json
,點擊發送的話,會報錯,後臺接收不到值,為null
。
這時候,註解@RequestBody就派上用場了。
@RequestBody
註解@RequestBody接收的引數是來自requestBody中,即請求體。一般用於處理非Content-Type: application/x-www-form-urlencoded
application/json
、application/xml
等型別的資料。
就application/json
型別的資料而言,使用註解@RequestBody可以將body裡面所有的json資料傳到後端,後端再進行解析。
GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。
POST請求中,通過HttpEntity傳遞的引數,必須要在請求頭中宣告資料的型別Content-Type,SpringMVC通過使用
HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的資料,然後繫結到相應的bean上。
向表中批量插入資料
舉個批量插入資料的例子,Controller層的寫法如下圖所示:
由於@RequestBody可用來處理Content-Type
為application/json
編碼的內容,所以在postman中,選擇body的型別為row
->JSON(application/json)
,
這樣在Headers
中也會自動變為Content-Type
:application/json
編碼格式。body內的資料如下圖所示:
批量向表中插入兩條資料,這裡的saveBatchNovel()
方法已經封裝了JPA
的saveAll()
方法。body
裡面的json
語句的key
值要與後端實體類的屬性一一對應。
注意:前端使用$.ajax的話,一定要指定contentType: "application/json;charset=utf-8;"
,預設為application/x-www-form-urlencoded
。
結論:通過@RequestBody可以解析 Body 中JSON 格式的資料。