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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

@RequestParam和@RequestBody的区别 (结合 Get/Post )

發(fā)布時間:2025/3/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @RequestParam和@RequestBody的区别 (结合 Get/Post ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、get方法

請求:例如http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev

  • 獲取請求參數(shù):
  • 直接獲取request 如:
  • public String getHtml(HttpServletRequest request) {}
  • 什么也不加,直接在方法中獲取參數(shù)值 如:
  • public String getHtml(String url, String token) {}
  • 利用@RequestParam 如:
  • public User getUserInfo(@RequestParam(value = "url",required = false) String url){}

    二、post方法

    請求: 如:

    • 獲取請求參數(shù):
  • 直接獲取request 如:
  • public String getHtml(HttpServletRequest request) {}
  • 使用@RequestBody 可接受的參數(shù) String, Map,JSONObject,或者對應的JavaBean
  • // post 請求的是json字符串,@RequestBody 將字符串轉(zhuǎn)為Map<>類型 @RequestMapping(value = "/search",method = RequestMethod.POST) public void search (@RequestBody Map<String,String> map){System.out.println("傳進來的參數(shù):" + map); } post : {"key":"value"} @RequestMapping(value = "/test") public String getStart1(@RequestBody Map<String,String> map) {return map.toString(); }
  • 直接獲取request,如:
  • public String getHtml(HttpServletRequest request) {} //這種方式只用在Content-Type=application/x-www-form-urlencoded這種情況下才能使用,sevlet將Body中的key-value轉(zhuǎn)成Param。@RequestMapping(value = "/getUserInfo") public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){ }

    三、Get與Post區(qū)別

    Get和Post都是Http協(xié)議的組件,所以底層都是使用tcp鏈接。Get的請求方式是將http的header和data一并發(fā)往服務端,也就是一條tcp數(shù)據(jù)包發(fā)送,這就會有兩個問題:數(shù)據(jù)量有限,依賴于Tcp負載能力,所以攜帶的數(shù)據(jù)量很大的情況下,容易造成重發(fā)。有的攜帶的數(shù)據(jù)只能接受轉(zhuǎn)化成ASCII字符。但是Post不一樣,post使用兩步走,先發(fā)送http的header,然后再傳輸data。數(shù)據(jù)類型也不受限制。而且數(shù)據(jù)隱秘性比較好。

    四、Get方式參數(shù)獲取

    get請求方式參數(shù)是拼接在url后,所以限制了可以發(fā)送的長度。Get不支持使用http Body獲取參數(shù),他只支持params,也就是URL拼接參數(shù)。如:

    http://127.0.01:1025/download?url=https://www.baidu.com&token=opera-dev
  • 默認方式
  • @RequestMapping(value = "/getUserInfo") public User getUserInfo(Integer id){ }

    默認情況下會從Param(就是URL后面的拼接參數(shù))獲取名字是id的項,自動轉(zhuǎn)化成Integer類型,其他的類型也是類似。

  • 使用@RequestParam
  • @RequestMapping(value = "/getUserInfo") public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){ }
  • 使用HttpServletRequest
  • @RequestMapping(value = "/getUserInfo") public User getUserInfo(HttpServletRequest request){Integer id = Integer.parseInt(request.getParameter("id"));if (id.intValue() == 0) {return null;} }

    這個方法是獲取整個URL的信息,然后手動獲取和分離參數(shù),和類型轉(zhuǎn)化。這個里面帶的內(nèi)容很多,不僅Param還有Header,Cookies等。

    五、Post方式參數(shù)獲取

    post可以傳遞參數(shù)可以大致分成兩種:

    • 一種是表單:在sevlet實現(xiàn)中mutipart/form-data和application/x-www-form-urlencoded會被特殊處理,請求參數(shù)將被放置于request.paramter,解析成map。
    • 第二種,已application/json,參數(shù)是存放在json中的,參數(shù)必須要用@RequestBody才能解析出來。
    • application/json和application/x-www-form-urlencoded區(qū)別

    @RequestBody是將post請求中內(nèi)容轉(zhuǎn)為一個整體對象。

    • @RequestBody的解析有兩個條件:
    • POST請求中content的值必須為json格式(存儲形式可以是字符串,也可以是byte數(shù)組)
    • @RequestBody注解的參數(shù)類型必須是完全可以接收參數(shù)值的類型,比如:Map,JSONObject,或者對應的JavaBean;所以Integer類型不能作為@RequestBody注解的參數(shù)類型,將上述代碼修改如下(前端改成get請求)即可

    1、使用@RequestBody 接收json字符串, Map,JSONObject,或者對應的JavaBean

    @RequestMapping(value = "/download")public String getHtml(@RequestBody String json) {JSONObject jsonObject=JSON.parseObject(json);String url=jsonObject.getString("url");String token=jsonObject.getString("token");return " "; }@RequestMapping(value = "/download")public String getHtml(@RequestBody User user) {return user.getName(); }//Integer類型不能作為@RequestBody注解的參數(shù)類型 @RequestMapping(value = "/getUserInfo") public User getUserInfo(@RequestBody Integer id){ }

    2、使用@RequestParam

    @RequestMapping(value = "/getUserInfo") public User getUserInfo(@RequestParam(value = "id",required = false) Integer id){ }

    這種方式只用在Content-Type=application/x-www-form-urlencoded這種情況下才能使用,sevlet將Body中的key-value轉(zhuǎn)成Param。

    有一個有趣的現(xiàn)象:

    • 如果Content-Type=mutipart/form-data,Body中加入?yún)?shù)和URL后面拼接參數(shù)一起做Post請求,都可以被加載到Param中,如果是同名的,只取用form-data中的。
    • 如果Content-Type=application/x-www-form-urlencoded和URL拼接的一起,如果是String類型,則兩個值會被拼接,其他類型取的是URL拼接的參數(shù)。
  • 通用HttpServletRequest
    ??
    和Get方式一樣,這是個通用的方式。這個也可以和URL拼接的一起搭,但是沒有RequestParam的String類型值被拼接問題,優(yōu)先級 form-data高于URL拼接高于x-www-form-urlencoded。
  • @RequestMapping(value = "/getUserInfo") public User getUserInfo(HttpServletRequest request){Integer id = Integer.parseInt(request.getParameter("id"));if (id.intValue() == 0) {return null;} }

    六、@RequestParam注解

    @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestParam {/*** 參數(shù)名稱(和value同等意思)*/@AliasFor("name")String value() default "";/*** 參數(shù)名稱 (和name同等意思)*/@AliasFor("value")String name() default "";/*** 是否必選(默認必選)*/boolean required() default true;/*** 參數(shù)默認值*/String defaultValue() default ValueConstants.DEFAULT_NONE;}
    • @RequestParam總體上來說,該注解類擁有三個參數(shù):
  • value、name 屬性都標識請求參數(shù)名(必須配置);
  • required:參數(shù)是否必傳,默認為 true,可以設置為非必傳false;(如果設置了必傳或默認,請求未傳遞參數(shù),將會拋出異常);
  • defaultValue:參數(shù)默認值,如果設置了該值,required 將會自動設置為 false;
    • @RequestParam注解獲取的參數(shù)放在請求哪?
  • get請求的 requestHeaders 中 content-type 這個字段,使用 form-data 表單形式攜帶參數(shù)請求;
  • Spring中的@RequestParam注解接收的參數(shù)大多數(shù)場景是來自requestHeaders中,即請求頭,也就是url中,格式為:http://localhost:8080?name=yc&age=23,由于url 長度有限制,所以參數(shù)需要限制數(shù)量和值得長度;
    • 如何使用:
  • 使用一:利用Postman工具,使用form-data提交Get請求  
    執(zhí)行代碼:
  • @RequestMapping(value = "/test", method = RequestMethod.GET)public void test(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("age") Integer age) {log.info("id = {}, name = {}, age = {}", id, name, age);}

    結(jié)果:

    id = 1, name = yc, age = 23
  • 使用二:不使用@RequestParam注解直接進行對象屬性賦值(不推薦使用,容易和@ReuqestBody混淆)
  • 代碼執(zhí)行:

    @Data @AllArgsConstructor @NoArgsConstructor public class User {private Integer id;private String name;private Integer age; }@RequestMapping(value = "/test", method = RequestMethod.GET)public void test(User user) {log.info("id = {}, name = {}, age = {}", user.getId(), user.getName(), user.getAge());}

    結(jié)果:

    id = 1, name = yc, age = 23
    • 使用場景:
  • 請求是為了查找資源,獲取服務器數(shù)據(jù);
  • 請求結(jié)果無持續(xù)性的副作用,例如:不會對數(shù)據(jù)庫進行添加、修改、刪除操作;
  • 傳入的參數(shù)不會太長,因為Get請求可能會產(chǎn)生很長的URL,或許會超過某些瀏覽器與服務器對URL的長度限制,導致請求失敗;
  • 七、@RequestBody注解

    @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RequestBody {/*** 默認參數(shù)必傳*/boolean required() default true;}
  • @RequestBody注解只擁有一個參數(shù):
  • required 默認為 true,即對象中的屬性必須有一個要傳,否則會拋出異常:

    org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
  • @RequestBody注解獲取的參數(shù)在請求哪?
    • post請求的requestHeaders請求頭中有content-type字段,一般用來處理:applicatin/json格式的參數(shù);
    • Spring中的@RequestBody注解是用來接收請求體中的參數(shù)數(shù)據(jù),即requestBody請求體中,故不受參數(shù)數(shù)據(jù)長度的限制;
  • 如何使用?
    使用Postman工具發(fā)送json格式的數(shù)據(jù):
  • 執(zhí)行代碼:

    @Data @AllArgsConstructor @NoArgsConstructor public class User {private Integer id;private String name;private Integer age;}@RequestMapping(value = "/test", method = RequestMethod.POST)public void test(@RequestBody User user) {log.info("id = {}, name = {}, age = {}", user.getId(), user.getName(), user.getAge());}

    結(jié)果:

    id = 1, name = yc, age = 23
  • 使用場景:
  • 請求的結(jié)果有持續(xù)性作用,例如:對數(shù)據(jù)庫添加、更新、刪除操作;

  • 若使用Get請求,表單參數(shù)過長;

  • 要傳送的數(shù)據(jù)不是采用7位的ASCII編碼;

    • 測試三:使用Post請求,@RequestParam也可以接收參數(shù);

    注意:也可以使用這種方式用,發(fā)送Post請求,參數(shù)拼接到url之后,這是因為協(xié)議之間沒有做嚴格的區(qū)分,但這種方式不建議使用,這種方式就使用Get方式即可。例如:localhost:8888/optimus-prime/project/test?id=1&name=yc&age=23 使用瀏覽器請求數(shù)據(jù),這種方式Get請求,但后端使用Post方式接收,訪問不成功!

    執(zhí)行代碼:

    @PostMapping(value = "/test") public void test(@RequestParam("id") Integer id,@RequestParam("name") String name,@RequestParam("age") Integer age) {log.info("id = {}, name = {}, age = {}", id, name, age); }

    結(jié)果:

    id = 1, name = yc, age = 12

    八、總結(jié)

  • Http協(xié)議常用的四種請求方式:Post、Get、Put、Delete等;其中Put、Delete請求方式很少見,都可用Post方式代替!
  • 對數(shù)據(jù)庫而言: get 請求不修改數(shù)據(jù)庫,只是查詢。Post是增加記錄,put是更新,Delete數(shù)據(jù)庫刪除;

  • Put,Post,Delete 方式的請求參數(shù)會直接放在requestBody里;

  • 處理 request uri 部分的注解,路徑參數(shù)變量:@PathVariable;

  • 處理request header部分的注解:@RequestHeader, @CookieValue,@RequestParam;

  • 處理request body部分的注解:@RequestParam, @RequestBody;

  • 綜上所述:@RequestParam注解既可以接收Get方式的請求頭中的參數(shù),也可以接收Post方式的請求體中的參數(shù);

  • get請求的 headers 中沒有 content-type 這個字段,post 的 content-type 有 :
  • application/x-www-form-urlencoded 這種就是一般的文本表單用 post 傳地數(shù)據(jù),只要將得到的data 用 @RequestParam 或request.getParamter() 獲取即可;

  • multipart/form-data ,用于文件上傳,此時 form 的 enctype 屬性必須指定為 multipart/form-data;

  • application/json,將數(shù)據(jù)以json對象的格式傳遞;

  • text/xml;

  • put 和 delete 請求的headers 是有 content-type 這個字段的,只不過這兩個方法類型目前不常用;

  • 參考文章
    參考文章

    總結(jié)

    以上是生活随笔為你收集整理的@RequestParam和@RequestBody的区别 (结合 Get/Post )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。