SpringMV常用註解之@requestbody和@requestparam
基本介紹
-
@requestparam
屬性介紹
- required:表示是否必須,預設為
true
,必須 - defaultValue:可設定請求引數的預設值
- value:為接收url的引數名(相當於key值)
-
@requestbody
屬性介紹
- required:表示是否必須,預設為
true
,必須
使用方式
@requestparam
@requestbody
註解@RequestBody接收的引數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的資料,比如:application/json、application/xml等型別的資料。就application/json
GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。
POST請求中,通過HttpEntity傳遞的引數,必須要在請求頭中宣告資料的型別Content-Type,SpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的資料,然後繫結到相應的bean上。
注意:前端使用$.ajax的話,一定要指定contentType: "application/json;charset=utf-8;"
application/x-www-form-urlencoded
。
@PostMapping("test4")
@ResponseBody
public String test4(@RequestBody List<UserEntity> lists) {
return "使用者:" + JSONUtil.toJsonStr(lists);
}
@PostMapping("test5")
@ResponseBody
public String test5(@RequestBody List<Map<String, Object>> maps) {
return "使用者:" + JSONUtil.toJsonStr(maps);
}
通過postman正確呼叫:
如果使用form表單提交,就會報錯:
get請求:
- 直接獲取request 如:public String getHtml(HttpServletRequest request) {}
- 什麼也不加,直接在方法中獲取引數值 如:public String getHtml(String url, String token) {}
- 利用@RequestParam 如: public User getUserInfo(@RequestParam(value = "url",required = false) String url){}
post請求:
- 直接獲取request 如:public String getHtml(HttpServletRequest request) {}
- 使用@RequestBody 可接受的引數 String,Map,JSONObject,或者對應的JavaBean,如: public User getUserInfo(@RequestBody Map<String,String> map){}
- 直接獲取request 如:public String getHtml(HttpServletRequest request) {}
區別
用來處理Content-Type為 application/x-www-form-urlencoded編碼的內容。(Http協議中,如果不指定Content-Type,則預設傳遞的引數就是application/x-www-form-urlencoded型別)RequestParam可以接受簡單型別的屬性,也可以接受物件型別。實質是Request.getParameter() 中的Key-Value引數Map利用Spring的轉化機制ConversionService配置,轉化成引數接收物件或欄位。
在Content-Type為application/x-www-form-urlencoded的請求中,get 方式中queryString的值和post方式中 body data的值都會被Servlet接受到並轉化到Request.getParameter()引數集中,所以@RequestParam可以獲取的到,除此之外delete型別的請求也可以使用@RequestParam註解。
屬性介紹:
- required:表示是否必須,預設為
true
,必須 - defaultValue:可設定請求引數的預設值
- value:為接收url的引數名(相當於key值)
@requestbody
處理HttpEntity傳遞過來的資料,也就是註解@RequestBody接收的引數是來自requestBody中,即請求體。一般用來處理Content-Type不為application/x-www-form-urlencoded編碼格式的資料。
1.GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。
2.POST請求中,通過HttpEntity傳遞的引數,必須要在請求頭中宣告資料的型別Content-Type,SpringMVC通過使用HandlerAdapter 配置的HttpMessageConverters來解析
required:表示是否必須,預設為true
,必須
- 區別
- 在GET請求中,不能使用@RequestBody。
- 在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對於引數轉化的配置必須統一。
- 使用@RequestBody接受的引數是不會被Servlet轉化統一放在request物件的Param引數集中,@RequestParam是可以的。