@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 格式的數據。