@RequestBody 和 @RequestParam 對應前端請求數(shù)據(jù)的編碼格式

@RequestParam

用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容。(Http協(xié)議中,如果不指定Content-Type,則默認傳遞的參數(shù)就是application/x-www-form-urlencoded類型)

RequestParam可以接受簡單類型的屬性,也可以接受對象類型, 但是復雜類型如數(shù)組則無法處理。

實質是將Request.getParameter() 中的Key-Value參數(shù)Map利用Spring的轉化機制ConversionService配置,轉化成參數(shù)接收對象或字段。

tips

在Content-Type: application/x-www-form-urlencoded的請求中,

get 方式中queryString的值,和post方式中 body data的值都會被Servlet接受到并轉化到Request.getParameter()參數(shù)集中,所以@RequestParam可以獲取的到。

@RequestBody

處理HttpEntity傳遞過來的數(shù)據(jù),一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù)。

GET請求中,因為沒有HttpEntity,所以@RequestBody并不適用。

POST請求中,通過HttpEntity傳遞的參數(shù),必須要在請求頭中聲明數(shù)據(jù)的類型Content-Type,SpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數(shù)據(jù),然后綁定到相應的bean上。

總結

在GET請求中,不能使用@RequestBody。

在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對于參數(shù)轉化的配置必須統(tǒng)一。

舉個例子,在SpringMVC配置了HttpMessageConverters處理棧中,指定json轉化的格式,如Date轉成‘yyyy-MM-dd’,則參數(shù)接收對象包含的字段如果是Date類型,就只能讓客戶端傳遞年月日的格式,不能傳時分秒。因為不同的接口,它的參數(shù)可能對時間參數(shù)有不同的格式要求,所以這樣做會讓客戶端調用同事對參數(shù)的格式有點困惑,所以說擴展性不高。

如果使用@RequestParam來接受參數(shù),可以在接受參數(shù)的model中設置@DateFormat指定所需要接受時間參數(shù)的格式。

另外,使用@RequestBody接受的參數(shù)是不會被Servlet轉化統(tǒng)一放在request對象的Param參數(shù)集中,@RequestParam是可以的。如果想把前端的對象轉化為urlencode類型的請求參數(shù),可以使用QueryString的stringify方法進行轉化。

綜上所述,一般情況下,推薦使用@RequestParam注解來接受Http請求參數(shù)。

---------------------

作者:xinluke

來源:CSDN

原文:https://blog.csdn.net/xinluke/article/details/52710706

版權聲明:本文為博主原創(chuàng)文章,略有改動,轉載請附上博文鏈接!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容