初次接觸Spring MVC的開發者們,可能對於參數的傳遞與接收會搞得很糊塗。經常出現參數傳遞或接收失敗的現象。本篇文章旨在用最通俗簡練的語句,讓大家了解各種情況下,如何進行參數的傳遞與接收。
一、GET請求和POST請求的區別是什么
相信接觸過WEB開發的人,都能大致說出一二。在我的理解中,GET和POST請求的區別主要有下面幾點
1)GET沒有請求體,POST有請求體
2)GET傳輸比POST快
3)GET只能攜帶少量數據(因為其請求url有長度限制),POST可以攜帶的數據量較大
4)POST因為將數據放在請求體中,GET將數據拼接到url中,所以POST比GET要安全
當然這對於GET和POST真正的區別來說,只是冰山一角,但在開發過程中,了解了這些基本也就夠用了,如果你想更加深入的了解GET和POST請求,這里推薦一篇博客:https://blog.csdn.net/song854601134/article/details/111053528,里面從各個層次各個方面介紹了GET與POST的區別。
二、不同類型參數傳遞方法
我們發現,由於GET請求沒有請求體,所以在發送GET請求時,都是進行請求URL的拼接。而POST請求攜帶有請求體,所以在請求時,不僅僅可以拼接URL,還可以在請求體中放入數據。
1、單個基本數據類型參數傳遞
單個基本類型數據傳遞時,后端往往只需要在接收方法中定義相應數據類型的數據,就可以直接接收
1)GET請求
2)POST請求
通過以上例子,我們可以看到,拼接URL路徑這個方法在get和post方式中都是可以實現的。但是如果現在的需求是,為了安全起見,不能夠讓URL中出現參數的信息,這個時候POST請求如何實現呢?請參照下面2.2的方法。
2、多個參數傳遞
1)多個變量接收
① GET請求
②POST請求
當使用這種方法接收的時候,需要保證前端傳遞的參數名與后端方法中定義的變量名保持完全一致,或者使用@RequestParam("前端傳遞的參數名")注解指定變量的對應關系。
通過以上兩種情況,我們可以得出結論,在以字符串拼接方式發送請求時,GET和POST請求的接收方式是完全一樣的。所以下面我們只針對於GET的方式與POST以請求體的方式傳遞時的接收方法進行介紹。
2)實體類接收
如果后台有一個實體類,滿足:
- 傳遞的參數集合為實體類屬性的子集(實體類包含了前端傳遞的所有參數,可以比前端傳遞的參數多,不可少);
- 實體類中參數必須有getter/setter方法。
那就可以在后端用該實體類進行接收。
① GET請求
GET請求只需要在后端方法中添加該實體類進行接收即可。
②POST請求
POST請求是將數據放入請求體中,將數據封裝成一個json對象進行傳遞,此時如果單純的使用Student對象接收是不可以的
這個時候需要借助一個注解:@RequestBody,加上這個注解后,Springmvc會從請求體中獲取數據並進行相應的轉換。
3)Map接收
當我們沒有對應的實體類可以用來接收前端傳遞過來的多個數據時,Map類無疑成為了最方便的一個類。其數據結構與JSON的極為相似也注定了Map作為SpringBoot數據傳遞中不可或缺的地位。
① GET請求
看了2)中用實體類接收的你,可能會認為使用Map接收時也和實體類一樣,直接在方法中加入Map類的參數就能接收,但現實卻是這樣的:
為什么會出現這樣的現象?當我們使用實體類Student時,里面的成員變量已經確定為name和age,springmvc只需要根據名稱調用setter方法進行數據填充即可,但是作為一個Map,它里面的參數名和數據沒有任何定義,所以springmvc不會將數據進行填充,導致了接收的Map為0的結果。
解決方法當然是有的,我們需要借助另外一個注解:@RequestParam,這個注解在之前也提到過,注意這個注解使用時,不需要指定name等屬性,直接使用該注解即可,加上之后,就可以接收了。
②POST請求
作為使用請求體傳遞數據的POST請求,后端可不可以直接使用Map接收呢?這個就不用想了,直接使用實體類接收都不能接收,更不用想使用更加復雜的Map類了。當然借助@RequestBody注解后,還是可以使用Map接收的,使用方法參照上面的實體類接收方法,只需要把方法中的參數改成一個Map對象即可。
3、數組
1)GET請求
你可能會想,GET請求不是只能進行URL拼接嗎,那我這個數組怎么拼接?換個思路,數組不就是多個參數嗎,我多拼接幾個同名的參數不就OK了嗎,空想不如實踐:
實踐證明,這個方法確實可以實現數組的接收。這里需要注意的是:
- @RequestParam注解是必須的,且方法中的變量名要與URL中的參數名相同,不同的話也可以通過@RequestParam里面的name進行設置
- 我這里使用的是List對象接收,其實使用String[]也是可以接收的,只是我個人比較喜歡使用List
2)POST請求
總結:以上就是GET和POST請求在各種數據類型下傳輸的方法,在需要進行數據傳遞時,首先分析使用GET還是POST請求發送,其次,確定后端需要使用什么數據類型接收數據,確定這兩個后,就可以使用對應的傳遞方法進行傳遞與接收。如果朋友們遇到其他情況下的數據傳遞與接收,請留言告訴我,我會進行補充。