1. 程式人生 > 實用技巧 >SpringMV常用註解之@requestbody和@requestparam

SpringMV常用註解之@requestbody和@requestparam

基本介紹

  • @requestparam

屬性介紹

  1. required:表示是否必須,預設為true,必須
  2. defaultValue:可設定請求引數的預設值
  3. value:為接收url的引數名(相當於key值)
  • @requestbody

屬性介紹

  1. required:表示是否必須,預設為true,必須

使用方式

@requestparam

@requestbody

  註解@RequestBody接收的引數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的資料,比如:application/json、application/xml等型別的資料。就application/json

型別的資料而言,使用註解@RequestBody可以將body裡面所有的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請求:

  1. 直接獲取request 如:public String getHtml(HttpServletRequest request) {}
  2. 什麼也不加,直接在方法中獲取引數值 如:public String getHtml(String url, String token) {}
  3. 利用@RequestParam 如: public User getUserInfo(@RequestParam(value = "url",required = false) String url){}

 post請求:

  1. 直接獲取request 如:public String getHtml(HttpServletRequest request) {}
  2. 使用@RequestBody 可接受的引數 String,Map,JSONObject,或者對應的JavaBean,如: public User getUserInfo(@RequestBody Map<String,String> map){}
  3. 直接獲取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註解。

  屬性介紹:

  1. required:表示是否必須,預設為true,必須
  2. defaultValue:可設定請求引數的預設值
  3. 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,必須
  • 區別
  1. 在GET請求中,不能使用@RequestBody。
  2. 在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對於引數轉化的配置必須統一。
  3. 使用@RequestBody接受的引數是不會被Servlet轉化統一放在request物件的Param引數集中,@RequestParam是可以的。

  @RequestBody和@RequestParam的區別

  @RequestBody和@RequestParam的請求方式get和post關係