用SpringBoot框架做項目時,經常需要前端給后端傳遞參數,如果需要多條參數,通常的做法是把這些參數封裝為一個對象來傳遞,前端用POST方式調用。但有時會遇到后端只需要一條參數(比如一個String)的情況,此時如果還封裝為一個對象,有些麻煩;最好的辦法是用GET方式調用,直接把參數拼接在url后面。然而,一般項目都有統一的接口規范,要求接口都要用POST方式,此時就遇到一個問題:controller方法上到底是用@RequestParam注解還是用@RequestBody注解?
之前對這兩個注解的區別,只有一個粗枝大葉的理解——@RequestParam針對單一的參數,而@RequestBody針對多個參數封裝為一個對象,問了身邊幾個同事,大概也都是這種理解。但是,實際測試中(使用Postman),當我用@RequestParam接受String的單一參數時,前端給我傳遞的參數卻接收不到。於是決定通過實驗,徹底搞明白二者的區別(針對單一參數、且規定使用POST方式的場景)。實驗的過程是分別用兩個注解去接受前端傳遞的一個名為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);
現在我用postman來測試幾種可能的參數傳遞方式:
1. 在Body的raw里面傳遞,也是最通常的傳參方式:
body-raw
結果是接收不到(不管是用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的形式傳遞。這是網上一些帖子里說的方式。
Headers方式
但結果還是接收不到!和上面一樣報錯400。
關於這一點,網上有些帖子里說@RequestParam的參數會寫到Headers里,可見是錯誤的,並非在Headers里,還是在Body里。
3. 在Body的form-data里通過key-value的形式傳遞,可以接收!
form-data
但是,前端在傳參時,是無法向這個form-data里傳遞參數的,所以這種方法可以被排除。
4. 在url后問號拼接參數。和很多人一樣,之前一直根深蒂固地認為只有GET方式才能用url問號傳參,POST方式不行,但事實證明在這里問號傳參POST方式同樣能接收到。如圖:
問號傳參
雖然能接受到參數,但前端也有統一的規范,一般不使用問號傳參的方式,所以這種方法也被排除。
實驗二:使用@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,經測試也無效。所以,這里只有唯一一種方式,就是將參數直接寫在Body的raw模式下,可以接收到,而且最好選擇Text而非JSON(application/json),如圖:
body
注意:這里body體里面傳什么內容,后台就會原樣接收,所以不要寫成content: XXX這種鍵值對形式,而應直接把String的內容寫在body體里。
總結:
對於傳遞單一參數(最典型的是String)的場合,最簡便的方法是用GET請求。但鑒於很多項目接口統一要求使用POST方式,此時不能使用@RequestParam方式,因為此方式前端傳遞的參數后端無法接收;而只能采用@RequestBody注解,直接將需要的參數內容寫入Body體,后端即可正常獲取!
之前對這兩個注解的區別,只有一個粗枝大葉的理解——@RequestParam針對單一的參數,而@RequestBody針對多個參數封裝為一個對象,問了身邊幾個同事,大概也都是這種理解。但是,實際測試中(使用Postman),當我用@RequestParam接受String的單一參數時,前端給我傳遞的參數卻接收不到。於是決定通過實驗,徹底搞明白二者的區別(針對單一參數、且規定使用POST方式的場景)。實驗的過程是分別用兩個注解去接受前端傳遞的一個名為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);
現在我用postman來測試幾種可能的參數傳遞方式:
1. 在Body的raw里面傳遞,也是最通常的傳參方式:
body-raw
結果是接收不到(不管是用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的形式傳遞。這是網上一些帖子里說的方式。
Headers方式
但結果還是接收不到!和上面一樣報錯400。
關於這一點,網上有些帖子里說@RequestParam的參數會寫到Headers里,可見是錯誤的,並非在Headers里,還是在Body里。
3. 在Body的form-data里通過key-value的形式傳遞,可以接收!
form-data
但是,前端在傳參時,是無法向這個form-data里傳遞參數的,所以這種方法可以被排除。
4. 在url后問號拼接參數。和很多人一樣,之前一直根深蒂固地認為只有GET方式才能用url問號傳參,POST方式不行,但事實證明在這里問號傳參POST方式同樣能接收到。如圖:
問號傳參
雖然能接受到參數,但前端也有統一的規范,一般不使用問號傳參的方式,所以這種方法也被排除。
實驗二:使用@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,經測試也無效。所以,這里只有唯一一種方式,就是將參數直接寫在Body的raw模式下,可以接收到,而且最好選擇Text而非JSON(application/json),如圖:
body
注意:這里body體里面傳什么內容,后台就會原樣接收,所以不要寫成content: XXX這種鍵值對形式,而應直接把String的內容寫在body體里。
總結:
對於傳遞單一參數(最典型的是String)的場合,最簡便的方法是用GET請求。但鑒於很多項目接口統一要求使用POST方式,此時不能使用@RequestParam方式,因為此方式前端傳遞的參數后端無法接收;而只能采用@RequestBody注解,直接將需要的參數內容寫入Body體,后端即可正常獲取!
<div marginwidth="0" marginheight="0" scrolling="no" width="100%">
<div>
<div id="kp_box_87" data-pid="87"><iframe src="https://adaccount.csdn.net/#/preview/555?m=AcitfvHbAEJcpmUJHcpJicbAooHAAJJJbnppmtAJpyHivLSLAvASvbHtQtWfSpbADXbJfpEbbEEnSSpncoSfALLntpHDJtQpnntQ&k=" frameborder="0" width="100%" height="75px" scrolling="no"></iframe><img class="pre-img-lasy" data-src="https://kunyu.csdn.net/1.png?d=2&k=&m=AcitfvHbAEJcpmUJHcpJicbAooHAAJJJbnppmtAJpyHivLSLAvASvbHtQtWfSpbADXbJfpEbbEEnSSpncoSfALLntpHDJtQpnntQ"></div>
</div>
</div>
<!-- <div class="question_wrap"><span>問題點數:</span><em>分</em></div> -->