@RequestParam和@ResponseBody註解的區別
阿新 • • 發佈:2018-11-21
@RequestParam 用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容。(Http協議中,如果不指定Content-Type,則預設傳遞的引數就是application/x-www-form-urlencoded型別) RequestParam可以接受簡單型別的屬性,也可以接受物件型別。 實質是將Request.getParameter() 中的Key-Value引數Map利用Spring的轉化機制ConversionService配置,轉化成引數接收物件或欄位。 tip 在Content-Type: application/x-www-form-urlencoded的請求中, get 方式中queryString的值,和post方式中 body data的值都會被Servlet接受到並轉化到Request.getParameter()引數集中,所以@RequestParam可以獲取的到。 @RequestBody 處理HttpEntity傳遞過來的資料,一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的資料。 •GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。 •POST請求中,通過HttpEntity傳遞的引數,必須要在請求頭中宣告資料的型別Content-Type,SpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的資料,然後繫結到相應的bean上。 總結 •在GET請求中,不能使用@RequestBody。 •在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對於引數轉化的配置必須統一。 舉個例子,在SpringMVC配置了HttpMessageConverters處理棧中,指定json轉化的格式,如Date轉成‘yyyy-MM-dd’,則引數接收物件包含的欄位如果是Date型別,就只能讓客戶端傳遞年月日的格式,不能傳時分秒。因為不同的介面,它的引數可能對時間引數有不同的格式要求,所以這樣做會讓客戶端呼叫同事對引數的格式有點困惑,所以說擴充套件性不高。 如果使用@RequestParam來接受引數,可以在接受引數的model中設定@DateFormat指定所需要接受時間引數的格式。 另外,使用@RequestBody接受的引數是不會被Servlet轉化統一放在request物件的Param引數集中,@RequestParam是可以的。 綜上所述,一般情況下,推薦使用@RequestParam註解來接受Http請求引數。
轉自:https://blog.csdn.net/xinluke/article/details/52710706