在此之前,我一直搞不清楚@RequestBody和@RequestParam到底有什么作用,在很多時候我發(fā)現(xiàn)即使我在controller中設置@RequestBody和@RequestParam或者不設置這些,依然能夠接收到請求參數(shù),但在某些情況下他們又行不通。所以本文旨在深入講解我們到底在什么情況下使用@RequestBody和@RequestParam,什么情況下不能使用@RequestBody和@RequestParam
在說上面問題之前,你需要了解HTTP的基本信息。用戶的瀏覽器訪問網(wǎng)站以及我們通過ajax請求的時候都是HTTP請求。http分為請求頭和請求體,在http請求頭里面有個參數(shù)叫Content-Type
Content-Type有三種取值情況
關于這三種情況的詳細解釋可以參考我的另一篇文章
關于HTTP的其他參數(shù)的詳細解釋也可以參考我的另一篇文章
如果你只是要了解spring mvc中的@RequestBody和@RequestParam到底怎么用,那么你無需詳細看我們的那兩篇文章,看本文就可以
content-type實際上是代表了你要給服務器發(fā)送的數(shù)據(jù)格式是什么
比如的你的content-type為application/json。那么你給后臺的請求就必須是一個json數(shù)據(jù),你的數(shù)據(jù)可能類似于
{ "name": "張三", "age": "22"}
而這種情況你的方法接收地方如果想用JavaBean接收必須使用@RequestBody。否則你將無法接收數(shù)據(jù)。同時你可能需要在你的spring mvc中配置json解析器。但一般情況下你公司的大牛已經幫你配置好,你無需配置。你的controller類似如下這樣
public Result updateAuditComment(@RequestBody TestDTO test) {}
其中TestDTO為你自己DTO.你需要在TestDTO中寫入與你的請求參數(shù)一致的屬性,并包含get set方法。
當然你也可以不通過JavaBean接收,那么你可以在你的controller中定義你需要的參數(shù),你可以使用@RequestParam,也可以不使用,例如對于如上請求你可以這么寫你的controlle
public Result updateAuditComment(String name,String age) {}
也可以這么寫
public Result updateAuditComment(@RequestParam String name,@RequestParam String age) {}
而比如你的content-type為x-www-form-urlencoded,這也是大多數(shù)情況下的設置,如果你沒有設置任何content-type。那么它默認就是這個。當content-type為x-www-form-urlencoded時證明你的數(shù)據(jù)格式需要為key=value&key=value的形式,例如
name = 張三 & age = 22
而這種情況你的方法的接收地方就不能使用@RequestBody。因為這個注解的作用是把得到的報文轉換成json.而你發(fā)送的并非json格式。所有不能使用這個注解,否則可能報錯Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。你的controller類似如下這樣
public Result updateAuditComment(TestDTO test) {}
類似的,你也可以不通過JavaBean接收,那么你可以在你的controller中定義你需要的參數(shù),你可以使用@RequestParam,也可以不使用,例如對于如上請求你可以這么寫你的controlle
public Result updateAuditComment(String name,String age) {}
也可以這么寫
public Result updateAuditComment(@RequestParam String name,@RequestParam String age) {}
通過上訴可以看出實際上@RequestParam并不會影響到參數(shù)的接收,它存在的意義僅僅是你可以通過它來設置默認值,設置別名,設置是否必須。關于@RequestParam加與不加的區(qū)別可以參考這篇文章