SpringBoot傳遞單一參數(shù)時@RequestParam和@RequestBody的區(qū)別小結
用SpringBoot框架做項目時,經(jīng)常需要前端給后端傳遞參數(shù),如果需要多條參數(shù),通常的做法是把這些參數(shù)封裝為一個對象來傳遞,前端用POST方式調用。但有時會遇到后端只需要一條參數(shù)(比如一個String)的情況,此時如果還封裝為一個對象,有些多余;最好的辦法是用GET方式調用,直接把參數(shù)拼接在url后面。但,一般項目都有統(tǒng)一的接口規(guī)范,要求接口都要用POST方式,此時就遇到一個問題:controller方法上到底是用@RequestParam注解還是用@RequestBody注解?
之前對這兩個注解的區(qū)別,只有一個粗枝大葉的理解——@RequestParam針對單一的參數(shù),而@RequestBody針對多個參數(shù)封裝為一個對象,問了身邊幾個同事,大概也都是這種理解。但是,實際測試中(使用Postman),當我用@RequestParam接受String的單一參數(shù)時,前端給我傳遞的參數(shù)卻接收不到。于是決定通過實驗,徹底搞明白二者的區(qū)別(針對單一參數(shù)、POST方法的場景)。實驗的過程是分別用@RequestParam和@RequestBody兩個注解去接受前端傳遞的一個名為content的String。
實驗一:使用@RequestParam注解
Controller方法代碼:(省略其他部分以及返回值Result代碼)
@RequestMapping(value="/requestParam", method= RequestMethod.POST, produces = "application/json;charset=UTF-8") public Result<String> requestParam(@RequestParam("content") String content) { System.out.println("content:"+content); return success(new Result<String>(), content);
現(xiàn)在我用postman來測試幾種可能的參數(shù)傳遞方式:
1. 在Body的raw里面?zhèn)鬟f,也是最通常的傳參方式:
結果是接收不到(不管是用text還是json等各種文本形式)!
{ "timestamp": 1544798083474, "status": 400, "error": "Bad Request", "exception": "org.springframework.web.bind.MissingServletRequestParameterException", "message": "Required String parameter 'content' is not present", "path": "/testParam/requestParam" }
2. 在Headers里通過key-value的形式傳遞。這是網(wǎng)上一些帖子里說的方式。
但結果還是接收不到!和上面一樣報錯400。
關于這一點,網(wǎng)上有些帖子里說@RequestParam的參數(shù)會寫到Headers里,可見是錯誤的,并非在Headers里,還是在Body里。
3. 在Body的form-data里通過key-value的形式傳遞,可以接收!
但是,前端調后端接口傳參時,是無法向這個form-data里傳遞參數(shù)的,所以這種方法只能被排除。
4. 在url后問號拼接參數(shù)。和很多人一樣,之前一直根深蒂固地認為只有GET方式才能用url問號傳參,POST方式不行,但事實證明在這里問號傳參POST方式同樣能接收到。如圖:
雖然能接受到參數(shù),但前端也有統(tǒng)一的規(guī)范,一般不使用問號傳參的方式,所以這種方法也被排除。
實驗二:使用@RequestBody注解
@RequestMapping(value="/requestBody", method= RequestMethod.POST, produces = "application/json;charset=UTF-8") public Result<String> requestBody(@RequestBody String content) { System.out.println("content:"+content); return success(new Result<String>(), content); }
既然是Body,自然不能在header里傳參,也不能在url里問號傳參。至于Body的form-data,經(jīng)測試也無效。所以,這里只有唯一一種方式,就是將參數(shù)直接寫在Body的raw模式下,實驗結果:可以接收到,如圖:
注意:這里body體里面?zhèn)魇裁磧热荩笈_就會原樣接收,所以不要寫成content: XXX這種鍵值對形式,而應直接把String的內容寫在body體里。
總結:
對于傳遞單一參數(shù)(最典型的是String)的場合,理論上最簡便的方法是用GET請求。但鑒于很多項目接口統(tǒng)一要求使用POST方式,此時不能使用@RequestParam方式,因為此方式前端傳遞的參數(shù)后端無法接收;而只能用@RequestBody,直接將需要的參數(shù)內容寫入Body體,后端即可正常獲取!
到此這篇關于SpringBoot傳遞單一參數(shù)時@RequestParam和@RequestBody的區(qū)別小結的文章就介紹到這了,更多相關SpringBoot @RequestParam @RequestBody內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java利用EasyExcel解析動態(tài)表頭及導出實現(xiàn)過程
以前做導出功能,表頭和數(shù)據(jù)都是固定的,下面這篇文章主要給大家介紹了關于Java利用EasyExcel解析動態(tài)表頭及導出實現(xiàn)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-12-12SpringBoot2零基礎到精通之profile功能與自定義starter
SpringBoot是一種整合Spring技術棧的方式(或者說是框架),同時也是簡化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起學習profile功能與自定義starter2022-03-03eclipse實現(xiàn)ElGamal數(shù)字簽名
這篇文章主要為大家詳細介紹了eclipse實現(xiàn)ElGamal數(shù)字簽名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06