註解@RequestParam與@RequestBody的使用場景

一、前言

一直有這麼一個疑問:在使用postman工具測試api接口的時候,如何使用 json 字符串傳值呢,而不是使用 x-www-form-urlencoded 類型,畢竟通過 key-value 傳值是有侷限性的。假如我要測試批量插入數據的接口呢,使用 x-www-form-urlencoded 方法根本就不適用於這種場景。

那麼如何通過postman工具使用json字符串傳值呢,這裡就引申出來了spring的兩個註解:

  • @RequestParam
  • @RequestBody

總而言之,這兩個註解都可以在後臺接收參數,但是使用場景不一樣。繼續往下看 ↓

二、@RequestParam

先介紹一下@RequestParam的使用場景:

註解@RequestParam接收的參數是來自requestHeader中,即請求頭通常用於GET請求,比如常見的url:http://localhost:8081/spring-boot-study/novel/findByAuthorAndType?author=唐家三少&type=已完結,其在Controller 層的寫法如下圖所示:

註解@RequestParam與@RequestBody的使用場景

@RequestParam有三個配置參數:

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

@RequestParam用來處理 Content-Type 為 application/x-www-form-urlencoded 編碼的內容,Content-Type 默認為該屬性。

@RequestParam也可用於其它類型的請求,例如:POST、DELETE等請求。比如向表中插入單條數據,Controller 層的寫法如下圖所示:

註解@RequestParam與@RequestBody的使用場景

由於@RequestParam是用來處理 Content-Type 為 application/x-www-form-urlencoded 編碼的內容的,所以在postman中,要選擇body的類型為 x-www-form-urlencoded,這樣在headers中就自動變為了 Content-Type : application/x-www-form-urlencoded 編碼格式。如下圖所示:

註解@RequestParam與@RequestBody的使用場景

但是這樣不支持批量插入數據啊,如果改用 json 字符串來傳值的話,類型設置為 application/json,點擊發送的話,會報錯,後臺接收不到值,為 null。

這時候,註解@RequestBody就派上用場了。繼續往下看 ↓

三、@RequestBody

先介紹一下@RequestBody的使用場景:

註解@RequestBody接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。

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

3.1 向表中批量插入數據

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

註解@RequestParam與@RequestBody的使用場景

由於@RequestBody可用來處理 Content-Type 為 application/json 編碼的內容,所以在postman中,選擇body的類型為row -> JSON(application/json),這樣在 Headers 中也會自動變為 Content-Type : application/json 編碼格式。body內的數據如下圖所示:

註解@RequestParam與@RequestBody的使用場景

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

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

3.2 後端解析json數據

上述示例是傳遞到實體類中的具體寫法,那麼如果傳遞到非實體類中,body裡面的json數據需要怎麼解析呢?我們再來看下面這個例子:

在body中,我們還是輸入上面的json數據,根據分析,上面的json數據是一個List數組內嵌套著map對象,那麼在後臺的接收形式可寫為 List>,具體代碼如下圖所示:

註解@RequestParam與@RequestBody的使用場景

postman請求:

註解@RequestParam與@RequestBody的使用場景

控制檯輸出:

註解@RequestParam與@RequestBody的使用場景

得出結論,通過@RequestBody可以解析Body中json格式的數據。

四、總結

註解@RequestParam接收的參數是來自requestHeader中,即請求頭通常用於GET請求,像POST、DELETE等其它類型的請求也可以使用。

註解@RequestBody接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。通常用於接收POST、DELETE等類型的請求數據,GET類型也可以適用。

總算把這兩個的邏輯理清楚了,postman也會用json傳值了!趕緊整理成筆記,與大家分享


--END--

碼字不易,如果您覺得文章寫得不錯,請關注作者~ 您的關注是我

寫作的最大動力


分享到:


相關文章: