最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中POST、GET、@RequestBody和@RequestParam區(qū)別詳析

 更新時間:2022年10月20日 10:08:08   作者:陳晨辰呀  
在前后端傳json數(shù)據(jù)進(jìn)行交互的時候,同學(xué)們會經(jīng)常用到的兩個注解,@RequestBody和@RequestParam主要是用來接收前端傳給后端的json數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中POST、GET、@RequestBody和@RequestParam區(qū)別的相關(guān)資料,需要的朋友可以參考下

@RequestParam

注解@RequestParam接收的參數(shù)是來自HTTP請求體或請求url的QueryString中。

RequestParam可以接受簡單類型的屬性,也可以接受對象類型。

@RequestParam有三個配置參數(shù):

  • required 表示是否必須,默認(rèn)為 true,必須。
  • defaultValue 可設(shè)置請求參數(shù)的默認(rèn)值。
  • value 為接收url的參數(shù)名(相當(dāng)于key值)。

@RequestParam用來處理 Content-Typeapplication/x-www-form-urlencoded 編碼的內(nèi)容,Content-Type默認(rèn)為該屬性。@RequestParam也可用于其它類型的請求,例如:POST、DELETE等請求

所以在postman中,要選擇body的類型為 x-www-form-urlencoded,這樣在headers中就自動變?yōu)榱?Content-Type : application/x-www-form-urlencoded 編碼格式。如下圖所示:

但是這樣不支持批量插入數(shù)據(jù)啊,如果改用 json 字符串來傳值的話,類型設(shè)置為 application/json,點(diǎn)擊發(fā)送的話,會報錯,后臺接收不到值,為 null。

但可以入?yún)⒑笤俎D(zhuǎn)換,參考如下:

   @PostMapping("/ali-receive")
    public void aliReceive(@RequestParam("message") String message) {
                ReceiveLog receiveLog = JSON.parseObject(message, ReceiveLog.class);
 
    }

解決Spring/SpringBoot @RequestParam注解無法讀取application/json格式數(shù)據(jù):http://m.fzitv.net/article/265478.htm

@RequestParam 接受JSON的字符串:

@RequestParam

1.用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內(nèi)容。(Http協(xié)議中,如果不指定Content-Type,則默認(rèn)傳遞的參數(shù)就是application/x-www-form-urlencoded類型)

@RequestParam可以接受簡單類型的屬性,也可以接受對象類型。

2.用來處理 multipart/form-data (表單上傳的)

如何使用@RequestParam 接受JSON的字符串

- 前端代碼

       const message = {
            "data": {
                "userInfo": "2804951212",
                "offerId": offerId,
                "action": "distribution",
                "categoryNav": categoryNav
            },
            "gmtBorn": time,
            "msgId": time,
            "type": "PRODUCT_COLLECTION",
            "userInfo": "chrome"
     
        };
        
        $.ajax({
            contentType :'application/x-www-form-urlencoded',
            type:'post',
            url: baseUrl+'/ali-receive',
            data:"message="+JSON.stringify(message)
        });

后端代碼

? ?@PostMapping("/ali-receive")
? ? public void aliReceive(@RequestParam("message") String message) {
? ? ? ? ? ? ? ? ReceiveLog receiveLog = JSON.parseObject(message, ReceiveLog.class);

? ? }

@RequestBody

一般用來處理 Content-Type: 為application/json

不推薦使用@RequestParam接收application/json,這時候就需要使用到@RequestBody。

@RequestBody

注解@RequestBody接收的參數(shù)是來自requestBody中,即請求體。一般用于處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù),比如:application/json、application/xml等類型的數(shù)據(jù)。

application/json類型的數(shù)據(jù)而言,使用注解@RequestBody可以將body里面所有的json數(shù)據(jù)傳到后端,后端再進(jìn)行解析。

GET請求中,因?yàn)闆]有HttpEntity,所以@RequestBody并不適用。

POST請求中,通過HttpEntity傳遞的參數(shù),必須要在請求頭中聲明數(shù)據(jù)的類型Content-Type,SpringMVC通過使用

HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數(shù)據(jù),然后綁定到相應(yīng)的bean上。

向表中批量插入數(shù)據(jù)

舉個批量插入數(shù)據(jù)的例子,Controller層的寫法如下圖所示:

由于@RequestBody可用來處理 Content-Typeapplication/json 編碼的內(nèi)容,所以在postman中,選擇body的類型為row -> JSON(application/json),這樣在 Headers 中也會自動變?yōu)?Content-Type : application/json 編碼格式。body內(nèi)的數(shù)據(jù)如下圖所示:

批量向表中插入兩條數(shù)據(jù),這里的 saveBatchNovel()方法已經(jīng)封裝了 JPAsaveAll() 方法。body 里面的 json 語句的 key 值要與后端實(shí)體類的屬性一一對應(yīng)。

注意:前端使用$.ajax的話,一定要指定 contentType: "application/json;charset=utf-8;",默認(rèn)為 application/x-www-form-urlencoded。

后端解析json數(shù)據(jù)

上述示例是傳遞到實(shí)體類中的具體寫法,那么如果傳遞到非實(shí)體類中,body里面的json數(shù)據(jù)需要怎么解析呢?我們再來看下面這個例子:

在body中,我們還是輸入上面的json數(shù)據(jù),根據(jù)分析,上面的json數(shù)據(jù)是一個List數(shù)組內(nèi)嵌套著map對象,那么在后臺的接收形式可寫為 List<Map<String, String>>,具體代碼如下圖所示:

postman請求:

控制臺輸出:

得出結(jié)論,通過@RequestBody可以解析Body中json格式的數(shù)據(jù)。

POST請求時

@RequestBody --> JSON字符串部分

@RequestParam --> 請求參數(shù)部分

application/json格局圖

form-data、x-www-form-urlencoded格局圖

1、從content-type方面總結(jié):

① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。見postman的格局,這兩種方式的時候沒有json字符串部分。

② application/json:json字符串部分可以用@RequestBody;url中的?后面參數(shù)可以用@RequestParam。見postman的格局

2、從兩種注解方式總結(jié):

@RequestBody

(@RequestBody Map map)
(@RequestBody Object object)
application/json時候可用
form-data、x-www-form-urlencoded時候不可用

@RequestParam

(@RequestParam Map map)
application/json時候,json字符串部分不可用,url中的?后面添加參數(shù)即可用,form-data、x-www-form-urlencoded時候可用,但是要將Headers里的Content-Type刪掉
(@RequestParam String waterEleId,@RequestParam String enterpriseName)
application/json時候,json字符串部分不可用,url中的?后面添加參數(shù)即可用
form-data、x-www-form-urlencoded時候可用,且參數(shù)可以沒有順序(即前端傳過來的參數(shù)或者url中的參數(shù)順序不必和后臺接口中的參數(shù)順序一致,只要字段名相同就可以),但是要將Headers里的Content-Type刪掉
(@RequestParam Object object)
不管application/json、form-data、x-www-form-urlencoded都不可用

既不是@RequestBody也不是@RequestParam,沒有指定參數(shù)哪種接收方式

(Map map)
(Object object)
application/json時候:json字符串部分不可用,url中的?后面添加參數(shù)不可用。
因?yàn)闆]有指定,它也不知道到底是用json字符串部分還是?后面添加參數(shù)部分,所以干脆都不可以用
form-data、x-www-form-urlencoded時都不可用,見圖二
 
(HttpServletRequest request)
application/json不可用
form-data、x-www-form-urlencoded時可用

GET請求

@RequestBody

RequestBody -- Map / Object
GET請求中不可以使用@RequestBody

@RequestParam

(@RequestParam Map map)
在url中的?后面添加參數(shù)即可使用
(@RequestParam String waterEleId,@RequestParam String enterpriseName)
在url中的?后面添加參數(shù)即可使用
(@RequestParam Object object)
GET請求中不可以使用

當(dāng)使用GET請求時,通過postman添加?后面的參數(shù),不用在url中自己一個一個拼,點(diǎn)擊Params,在下面key-value中輸入就自動拼接到url中

舉栗子

上傳文件,包含了圖中圈出來的兩部分

如果這樣,沒有@RequestParam,那么url?后的參數(shù)就拿不到

@RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
    public ResponseObj<Boolean> leadingIn(Map formData,
                                          HttpServletRequest request,
                                          Map<String, InputStream> files) {
}

如果control中這樣接收,本來想formData只接收url?后的參數(shù),結(jié)果將{ "retCode": null, "data": true }這部分內(nèi)容也拿到了,真實(shí)意外之喜。字符串這部分內(nèi)容還可以從request中取到,見下面完整方法。

@RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
    public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
                                          HttpServletRequest request,
                                          Map<String, InputStream> files) {
}

完整方法

    /**
     * 導(dǎo)入
     */
    @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
    public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
                                          HttpServletRequest request,
                                          Map<String, InputStream> files) {
        //測試
        try {
            MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request;
            Set<Map.Entry<String, MultipartFile>> set = mulRequest.getFileMap().entrySet();
            Map<String, InputStream> listFile = new LinkedHashMap<>();
            System.out.println("個數(shù)" + set.size());
            for (Map.Entry<String, MultipartFile> each : set) {
                String fileName = each.getKey();
                MultipartFile file = each.getValue();
                //這里需要上傳FTP
                try {
                    listFile.put(fileName, file.getInputStream());
                } catch (Exception ex) {
                    return new ResponseObj<>(false, null);
                }
            }
 
            String formjson = mulRequest.getParameter("content");
            ObjectMapper mapper = new ObjectMapper();
            mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
 
//            boolean result = iInstallWorkOrder.upLoadFile(listFile);
            boolean result = true;
 
            return new ResponseObj<>(result, null);
        } catch (Exception ex) {
            System.out.println(ex.toString());
            return new ResponseObj<>(false, null);
        }
 
    }

按F12看一下Network里對應(yīng)請求:

使用@RequestParam:Content-Type為application/x-www-form-urlencoded,參數(shù)在FormData中

使用@RequestBody:Content-Type為application/json,參數(shù)在Request PayLoad中

總結(jié)

•在GET請求中,不能使用@RequestBody。

•在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對于參數(shù)轉(zhuǎn)化的配置必須統(tǒng)一。

可以使用多個@RequestParam獲取數(shù)據(jù),@RequestBody不可以 舉個例子,在SpringMVC配置了HttpMessageConverters處理?xiàng)V?,指定json轉(zhuǎn)化的格式,如Date轉(zhuǎn)成‘yyyy-MM-dd’,則參數(shù)接收對象包含的字段如果是Date類型,就只能讓客戶端傳遞年月日的格式,不能傳時分秒。因?yàn)椴煌慕涌?,它的參?shù)可能對時間參數(shù)有不同的格式要求,所以這樣做會讓客戶端調(diào)用同事對參數(shù)的格式有點(diǎn)困惑,所以說擴(kuò)展性不高。 如果使用@RequestParam來接受參數(shù),可以在接受參數(shù)的model中設(shè)置@DateFormat指定所需要接受時間參數(shù)的格式。 另外,使用@RequestBody接受的參數(shù)是不會被Servlet轉(zhuǎn)化統(tǒng)一放在request對象的Param參數(shù)集中,@RequestParam是可以的。

另外,還有一種應(yīng)用場景,接口規(guī)范為resultful風(fēng)格時,舉個例子:如果要獲取某個id下此條問題答案的查詢次數(shù)的話,則后臺就需要動態(tài)獲取參數(shù),其注解為@PathVariable,并且requestMapping中的value應(yīng)為value="/{id}/queryNum",截圖如下:

到此這篇關(guān)于Java中POST、GET、@RequestBody和@RequestParam區(qū)別詳析的文章就介紹到這了,更多相關(guān)POST GET @RequestBody和@RequestParam區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

參考:

@RequestParam @RequestBody @PathVariable 等參數(shù)綁定注解詳解

https://blog.csdn.net/walkerjong/article/details/7946109

https://my.oschina.net/u/3372000/blog/906217

https://www.jianshu.com/p/4981911d5e15

https://cloud.tencent.com/developer/article/1414464

相關(guān)文章

  • Java?Arrays.copyOf?功能示例代碼

    Java?Arrays.copyOf?功能示例代碼

    Arrays.copyOf功能是實(shí)現(xiàn)數(shù)組的復(fù)制,返回復(fù)制后的數(shù)組,這篇文章主要介紹了Java?Arrays.copyOf?功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Java中BeanUtils.copyProperties基本用法與小坑

    Java中BeanUtils.copyProperties基本用法與小坑

    本文主要介紹了Java中BeanUtils.copyProperties基本用法與小坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java 阻塞隊(duì)列詳解及簡單使用

    Java 阻塞隊(duì)列詳解及簡單使用

    這篇文章主要介紹了Java 阻塞隊(duì)列詳解及簡單使用的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java中Map和Set的常見用法舉例

    Java中Map和Set的常見用法舉例

    Map和Set是一種專門用來進(jìn)行搜索的容器或者數(shù)據(jù)結(jié)構(gòu),其具體效率與具體的實(shí)例化子類有關(guān),下面這篇文章主要給大家介紹了關(guān)于Java中Map和Set的常見用法,需要的朋友可以參考下
    2024-04-04
  • mybatis-plus處理blob字段的完整示例代碼

    mybatis-plus處理blob字段的完整示例代碼

    在Spring Boot項(xiàng)目中使用MyBatis-Plus處理longblob字段時,我們可以按照本文的步驟進(jìn)行操作,假設(shè) longblob 存儲的是字符串?dāng)?shù)據(jù),本文給大家提供完整示例代碼,感興趣的朋友參考下
    2023-12-12
  • 如何用java計算兩個時間相差多少小時

    如何用java計算兩個時間相差多少小時

    最近工作中遇到需要計算時間差,下面這篇文章主要給大家介紹了關(guān)于如何用java計算兩個時間相差多少小時的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • MapTask工作機(jī)制圖文詳解

    MapTask工作機(jī)制圖文詳解

    今天小編就為大家分享一篇關(guān)于MapTask工作機(jī)制圖文詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java中的內(nèi)部類你了解嗎

    Java中的內(nèi)部類你了解嗎

    這篇文章主要為大家介紹了Java的內(nèi)部類,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 詳解Spring Boot使用Maven自定義打包方式

    詳解Spring Boot使用Maven自定義打包方式

    這篇文章主要介紹了Spring Boot使用Maven自定義打包方式,本文通過多種方式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Prometheus監(jiān)控Springboot程序的實(shí)現(xiàn)方法

    Prometheus監(jiān)控Springboot程序的實(shí)現(xiàn)方法

    這篇文章主要介紹了Prometheus監(jiān)控Springboot程序的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

宽甸| 册亨县| 常德市| 益阳市| 甘洛县| 广灵县| 民县| 磐石市| 浦城县| 泸西县| 南汇区| 麻江县| 达日县| 石景山区| 双城市| 嘉黎县| 吐鲁番市| 大荔县| 翁源县| 菏泽市| 贵州省| 汝州市| 五原县| 彭水| 乌兰察布市| 东城区| 神木县| 邵东县| 阿鲁科尔沁旗| 东安县| 南华县| 阿勒泰市| 马边| 苗栗县| 潼关县| 响水县| 城口县| 黔东| 融水| 长阳| 天柱县|