日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

@requestbody和@requestparam作用

發(fā)布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @requestbody和@requestparam作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、什么都不寫

GET

可以自動封裝為對象模型,沒有的數值自動為0值

POST

請求體里面放了數據,但是還是使用了RequestParam里的數據

總結:

在不使用注解的情況下,相當于默認使用了RequestParam里的數據 (這種理解是錯誤的,真實的原因參考下面段落 有一個有趣的現象 ),而且可以自動封裝為對象模型,沒有的數據也不會報錯,而是設為0值
post請求時,如果不使用 contentType:'application/json;charset=utf-8',參數還是可以在RequestParam里獲取,所以也可以封裝為對象模型。

2、使用@RequestParam

GET POST

結果都是400:Required Student parameter ‘student’ is not present
使用@RequsetParam時,無法封裝對象模型,只能接受簡單數據類型(String int 等)。
值得注意的是如果使用@RequestParam(required = false),在沒有對應數據時不會報400錯誤,而是賦為0值。

3、使用@RequestBody

GET


結果400:The request sent by the client was syntactically incorrect.
使用get請求沒有請求體,而使用@RequestBody獲取的肯定是請求體里的數據

POST


結果415:The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.
因為Http協議中,如果不指定Content-Type,則默認傳遞的參數就是application/x-www-form-urlencoded類型。使用@RequestBody必須使用 contentType:'application/json;charset=utf-8' ,且只能是post請求。

結果:{“name”:“l(fā)isi”,“no”:“001”,“age”:12}
將Content-Type手動設置為json格式,可以把請求體里的json字符串,讀出來封裝為對象模型。

總結

不寫注解,默認使用RequestParam里的數據,而且沒有的話也不報錯,讀為0值;
@RequestParam使用的是RequestParam里的數據。key和變量名必須一致,否則報錯。無法封裝對象模型接受參數;
@RequestBody使用的是請求體里的數據,必須使用json格式,需要在請求體里面設置Content-Type:application/json;


結果:{“name”:“zhangsan”,“no”:“001”,“age”:12}
使用了RequestParam的name,RequestBody的no和age。

另外


結果與上方一致。{“name”:“zhangsan”,“no”:“001”,“age”:12}
因為url路徑后面的值都會被Servlet接受到并轉化到Request.getParameter()參數集中(HttpServletRequest request),所以@RequestParam可以獲取的到。即request.getParameter(" ")能得到的數據使用@RequestParam也可以得到

-----------------分割線------------------------------------------------------------------------------

之前理解的太片面。工作中有遇到了上面結論解釋不了的情況,使用post請求,但是參數能從RequestParam里面獲取。不得不再次開始查資料。
首先應該理解:Query String Parameters、Form Data、Request Payload的區(qū)別

參考:https://blog.csdn.net/qq_43842093/article/details/121312409

發(fā)起一次POST請求時,若未指定content-type,則默認content-type為application/x-www-form-urlencoded。即參數會以Form Data的形式進行傳遞,不會顯式出現在請求url中。請求參數將被放置于request.paramter,解析成map。在控制臺看到,數據就是在Form Data中。form表單中數據被編碼為key/value格式發(fā)送到服務器(表單默認的提交數據的格式為application/x-www-form-urlencoded)。
所以url、Query String Parameters、Form Data里的參數都可以通過@RequestParam或者request.getParameter(" ")獲取。

@RequestBody

@RequestBody是將post請求中內容轉為一個整體對象。
@RequestBody的解析有兩個條件:

  • POST請求中content的值必須為json格式(存儲形式可以是字符串,也可以是byte數組); contentType:'application/json;charset=utf-8'
  • @RequestBody注解的參數類型必須是完全可以接收參數值的類型,比如:Map,JSONObject,或者對應的JavaBean;
    所以Integer類型不能作為@RequestBody注解的參數類型
  • @RequestParam

    這種方式只用在Content-Type=application/x-www-form-urlencoded這種情況下才能使用,sevlet將Body中的key-value轉成Param。
    有一個有趣的現象

  • 如果Content-Type=application/x-www-form-urlencoded,url和body中有相同的屬性名。如果是String類型,則兩個值會被拼接,其他類型取的是URL拼接的參數。
  • $.ajax({type: "post",contentType: "application/x-www-form-urlencoded",url: "xhh/add.do?name=zhangsan&age=90",data: data.field,dataType: "json",success: function (data) {alert(data.toString());} 12345678910@RequestMapping(value = "/add.do", method = {RequestMethod.POST})public String test(@RequestParam("name") String name,@RequestParam("age") int age){System.out.println("name:" + name);System.out.println("age" + age);return name;} 1234567


    后臺打印結果:

    name:zhangsan,qqq age:90 12
  • 如果Content-Type=mutipart/form-data,Body中加入參數和URL后面拼接參數一起做Post請求,都可以被加載到Param中,如果是同名的,只取用form-data中的。
  • $.ajax({ type: "post", contentType: "mutipart/form-data", url: "xhh/add.do?name=zhangsan&age=90", data: data.field, dataType: "json", success: function (data) {alert(data.toString()); } 12345678910

    控制層代碼同上
    前端傳參同上

    后臺打印結果:

    name:zhangsan age:90 12
  • get請求,結果與上面2個并不完全相同,至于是獲取url數據還是Query String Parameters里數據,還是拼接,具體情況再具體測吧,總之避免這種情況出現最好。
  • application/x-www-form-urlencoded : 表單中默認的ContentType,form表單數據被編碼為key/value格式發(fā)送到服務器(表單默認的提交數據的格式)

    通用HttpServletRequest

    和Get方式一樣,這是個通用的方式。這個也可以和URL拼接的一起搭,但是沒有RequestParam的String類型值被拼接問題,優(yōu)先級 form-data高于URL拼接高于x-www-form-urlencoded。

    參考:https://blog.csdn.net/qq_43194157/article/details/107617370

    后端如果用springMVC的@RequestBody注解的話,則只能接收Json對象的字符串,不能接收Json對象,用 JSON.stringify(data)的方式將對象變成字符串,同時ajax請求也要指定dataType: “json”,contentType:“application/json” ,這樣就能用@RequestBody注解綁定對象或者List集合.

    參考:https://blog.csdn.net/weixin_38676276/article/details/87630740

    這次得出的結論:
    1.@RequestBody只能用來接受Json格式的字符串,前端必須使用 contentType:'application/json;charset=utf-8' ,必須是post請求。
    2.@RequestParam或者沒有注解獲取的都是requestParam(除了contentType:'application/json;charset=utf-8'時,其他情況下參數都會被封裝在requestParam里。如果url和body里面都有重名的參數,參考 有一個有趣的現象 那里)里的數據。不管是對象模型里的屬性(即使用對象模型接收參數的時候),還是基本數據類型都一樣。
    區(qū)別是沒有注解的情況下相當使用了@RequestParam(required = false) ,不傳不會報錯,給0值。

    總結

    以上是生活随笔為你收集整理的@requestbody和@requestparam作用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。