欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談@RequestBody和@RequestParam可以同時使用

 更新時間:2022年03月14日 11:18:18   作者:靈穎橋人  
這篇文章主要介紹了@RequestBody和@RequestParam可以同時使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@RequestBody和@RequestParam可以同時使用嗎

@RequestParam和@RequestBody這兩個注解是可以同時使用的。

網(wǎng)上有很多博客說@RequestParam 和@RequestBody不能同時使用,這是錯誤的。

根據(jù)HTTP協(xié)議,并沒有說post請求不能帶URL參數(shù),經(jīng)驗證往一個帶有參數(shù)的URL發(fā)送post請求也是可以成功的。只不過,我們?nèi)粘i_發(fā)使用GET請求搭配@RequestParam,使用POST請求搭配@RequestBody就滿足了需求,基本不怎么同時使用二者而已。

自己個人實際驗證結(jié)果

package com.example.model; 
import java.util.List; 
public class PramInfo {
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getStr() {
        return str;
    }
 
    public void setStr(String str) {
        this.str = str;
    }
 
    private int id;
    private String str; 
}
package com.example.demo; 
import com.example.model.PramInfo;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; 
 
@RestController
@RequestMapping(value = "/test")
public class TestContoller { 
    @RequestMapping(value = "/dxc")
    public String print(PramInfo info) {
        return info.getId() + ": :" + info.getStr();
    }
 
    @RequestMapping(value = "/getUserJson")
    public String getUserJson(@RequestParam(value = "id") int id, @RequestParam(value = "name2", required = false) String name2
            , @RequestBody PramInfo pramInfo) {
        return (id + "--" + name2 + ";paramInfo:" + pramInfo.getStr() + ";pramInfo.id:" + pramInfo.getId());
    }
}

在postman發(fā)送如下post請求,返回正常

body中參數(shù)如下

從結(jié)果來看,post請求URL帶參數(shù)是沒有問題的,所以@RequestParam和@RequestBody是可以同時使用的【經(jīng)測試,分別使用Postman 和 httpClient框架編程發(fā)送http請求,后端@RequestParam和@RequestBody都可以正常接收請求參數(shù),所以個人認為可能一些前端框架不支持或者沒必要這么做,但是不能說@RequestParam和@RequestBody 不能同時使用】。

值得注意的地方

1、postman的GET請求是不支持請求body的;

2、

 @GetMapping(value = "/dxc")
    public String print(PramInfo info) {
        return info.getId() + ": :" + info.getStr();
    }

這種請求方式,不加@RequestParam注解,也能直接取出URL后面的參數(shù),即參數(shù)可以與定義的類互相自動轉(zhuǎn)化。    

3、

@PostMapping(value = "/getUserJson")
    public String getUserJson(@RequestParam(value = "id") int id, @RequestParam(value = "name2", required = false) String name2
            , @RequestBody PramInfo pramInfo) {
        return (id + "--" + name2 + ";paramInfo:" + pramInfo.getStr() + ";pramInfo.id:" + pramInfo.getId());

如果請求中的body沒有ParamInfo對象對應(yīng)的json串,即當body為空(連json串的{}都沒有)時,會報請求body空異常:

 2018-05-12 23:45:27.494  WARN 6768 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.example.demo.TestContoller.getUserJson(int,java.lang.String,com.example.model.PramInfo)
-05-12 23:45:27.494  WARN 6768 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.example.demo.TestContoller.getUserJson(int,java.lang.String,com.example.model.PramInfo)

@RequestBody和@RequestParam注解使用說明

@RequestBody作用

主要用來接收前端傳遞給后端的json字符串中的數(shù)據(jù)的(請求體中的數(shù)據(jù));

@RequestParam作用

將請求參數(shù)綁定到你控制器的方法參數(shù)上

GET方式無請求體,所以使用@RequestBody接收數(shù)據(jù)時,前端不能使用GET方式提交數(shù)據(jù),而是用POST方式進行提交。在后端的同一個接收方法里,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多只能有一個,而@RequestParam()可以有多個。

@RequestBody:

  • 注:一個請求,只有一個RequestBody;一個請求,可以有多個RequestParam。
  • 注:當同時使用@RequestParam()和@RequestBody時,@RequestParam()指定的參數(shù)可以是普通元素、數(shù)組、集合、對象等等(即:當,@RequestBody 與@RequestParam()可以同時使用時,原SpringMVC接收參數(shù)的機制不變,只不過RequestBody 接收的是請求體里面的數(shù)據(jù);而RequestParam接收的是key-value里面的參數(shù),所以它會被切面進行處理從而可以用普通元素、數(shù)組、集合、對象等接收)。
  • 即:如果參數(shù)時放在請求體中,傳入后臺的話,那么后臺要用@RequestBody才能接收到;如果不是放在請求體中的話,那么后臺接收前臺傳過來的參數(shù)時,要用@RequestParam來接收,或者形參前什么也不寫也能接收。
  • 注:如果參數(shù)前寫了@RequestParam(xxx),那么前端必須有對應(yīng)的xxx名字才行(不管其是否有值,當然可以通過設(shè)置該注解的required屬性來調(diào)節(jié)是否必須傳),如果沒有xxx名的話,那么請求會出錯,報400。
  • 注:如果參數(shù)前不寫@RequestParam(xxx)的話,那么就前端可以有可以沒有對應(yīng)的xxx名字才行,如果有xxx名的話,那么就會自動匹配;沒有的話,請求也能正確發(fā)送。
  • 注:這里與feign消費服務(wù)時不同;feign消費服務(wù)時,如果參數(shù)前什么也不寫,那么會被默認是@RequestBody的。

如果后端參數(shù)是一個對象

且該參數(shù)前是以@RequestBody修飾的,那么前端傳遞json參數(shù)時,必須滿足以下要求:

  • 后端@RequestBody注解對應(yīng)的類在將HTTP的輸入流(含請求體)裝配到目標類(即:@RequestBody后面的類)時,會根據(jù)json字符串中的key來匹配對應(yīng)實體類的屬性,如果匹配一致且json中的該key對應(yīng)的值符合(或可轉(zhuǎn)換為),這一條我會在下面詳細分析,其他的都可簡單略過,但是本文末的核心邏輯代碼以及幾個結(jié)論一定要看! 實體類的對應(yīng)屬性的類型要求時,會調(diào)用實體類的setter方法將值賦給該屬性。
  • json字符串中,如果value為"“的話,后端對應(yīng)屬性如果是String類型的,那么接受到的就是”",如果是后端屬性的類型是Integer、Double等類型,那么接收到的就是null。
  • json字符串中,如果value為null的話,后端對應(yīng)收到的就是null。
  • 如果某個參數(shù)沒有value的話,在傳json字符串給后端時,要么干脆就不把該字段寫到j(luò)son字符串中;要么寫value時, 必須有值,null 或""都行

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時素材

    java實現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時素材

    這篇文章主要為大家詳細介紹了java實現(xiàn)上傳網(wǎng)絡(luò)圖片到微信臨時素材,網(wǎng)絡(luò)圖片上傳到微信服務(wù)器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java中的泛型方法詳解及簡單實例

    Java中的泛型方法詳解及簡單實例

    這篇文章主要介紹了Java中的泛型方法詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例

    Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例

    這篇文章主要介紹了Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • 詳解Java Socket通信封裝MIna框架

    詳解Java Socket通信封裝MIna框架

    Mina異步IO使用的Java底層JNI框架,Mina提供服務(wù)端和客戶端,將我們的業(yè)務(wù)解耦開發(fā),真正做到高內(nèi)聚低耦合的思想。
    2021-06-06
  • intellij IDEA配置springboot的圖文教程

    intellij IDEA配置springboot的圖文教程

    Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。接下來通過本文給大家介紹intellij IDEA配置springboot的圖文教程,感興趣的朋友一起看看吧
    2018-03-03
  • spring和quartz整合,并簡單調(diào)用(實例講解)

    spring和quartz整合,并簡單調(diào)用(實例講解)

    下面小編就為大家?guī)硪黄猻pring和quartz整合,并簡單調(diào)用(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 詳解springboot通過Async注解實現(xiàn)異步任務(wù)及回調(diào)的方法

    詳解springboot通過Async注解實現(xiàn)異步任務(wù)及回調(diào)的方法

    這篇文章主要介紹了springboot通過Async注解實現(xiàn)異步任務(wù)及回調(diào),文中通過一個簡單示例來直觀的理解什么是同步調(diào)用,在單元測試用例中,注入?SyncTask?對象,并在測試用例中執(zhí)行?doTaskOne(),doTaskTwo(),doTaskThree()?三個方法,具體實現(xiàn)方式跟隨小編一起看看吧
    2022-05-05
  • Java核心技術(shù)之反射

    Java核心技術(shù)之反射

    本文非常詳細的講解了java反射的相關(guān)資料,java反射在現(xiàn)今的使用中很頻繁,希望此文可以幫大家解答疑惑,可以幫助大家理解
    2021-11-11
  • JAVA操作MongoDB數(shù)據(jù)庫實例教程

    JAVA操作MongoDB數(shù)據(jù)庫實例教程

    MongoDB是一個文檔型數(shù)據(jù)庫,是NOSQL家族中最重要的成員之一,下面這篇文章主要給大家介紹了關(guān)于JAVA操作MongoDB數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • 解讀controller層,service層,mapper層,entity層的作用與聯(lián)系

    解讀controller層,service層,mapper層,entity層的作用與聯(lián)系

    這篇文章主要介紹了關(guān)于controller層,service層,mapper層,entity層的作用與聯(lián)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論