1. 程式人生 > 實用技巧 >@RequestBody和@RequestParam區別

@RequestBody和@RequestParam區別

@RequestParam

註解@RequestParam接收的引數是來自HTTP請求體或請求url的QueryString中。

RequestParam可以接受簡單型別的屬性,也可以接受物件型別。

@RequestParam有三個配置引數:

  • required表示是否必須,預設為true,必須。
  • defaultValue可設定請求引數的預設值。
  • value為接收url的引數名(相當於key值)。

@RequestParam用來處理Content-Typeapplication/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/jsonapplication/xml等型別的資料。

application/json型別的資料而言,使用註解@RequestBody可以將body裡面所有的json資料傳到後端,後端再進行解析。

GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。

POST請求中,通過HttpEntity傳遞的引數,必須要在請求頭中宣告資料的型別Content-Type,SpringMVC通過使用

HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的資料,然後繫結到相應的bean上。

向表中批量插入資料

舉個批量插入資料的例子,Controller層的寫法如下圖所示:

由於@RequestBody可用來處理Content-Typeapplication/json編碼的內容,所以在postman中,選擇body的型別為row->JSON(application/json)

這樣在Headers中也會自動變為Content-Type:application/json編碼格式。body內的資料如下圖所示:

批量向表中插入兩條資料,這裡的saveBatchNovel()方法已經封裝了JPAsaveAll()方法。body裡面的json語句的key值要與後端實體類的屬性一一對應。

注意:前端使用$.ajax的話,一定要指定contentType: "application/json;charset=utf-8;",預設為application/x-www-form-urlencoded

結論:通過@RequestBody可以解析 Body 中JSON 格式的資料。