SpringMVC—請求(Request)
訪問不同的路徑,就是發送不同的請求;在發送請求時,可能會帶一些參數,所以學習Spring的請求,主要是學習如何傳遞參數到后端
以及后端如何接收
;
我們主要是使用 瀏覽器
和 Postman
來模擬傳遞參數
的過程
后端開發人員無需過度關注如何傳遞參數,了解即可,實際開發中以 Postman 測試為主:
比如餐廳的廚師,不關注用戶是在店里下單,還是外賣平臺下單,或者小程序下單,只需要知道如何接收訂單,根據訂單做出對應的菜肴就可以了.
1.傳遞單個參數
(1) 處理常見兩個報錯
第一個報錯 |
我們來看下列報錯
這是因為啟動類的名字不能隨便修改,而煮啵剛剛看.example 不順眼,就刪掉了;
把啟動類的名字改回去,這個和的pom.xml里面寫的是一樣的。一般是在創建項目的時候就規定好了的;
所以,我們應該在剛開始創建項目的時候,提前指定好啟動類的名字,編譯器會自動配置對應的 porn 文件
第二個報錯 |
遇到上述問題,修改下列這些地方即可:
(2) 正常傳遞參數
接收單個參數,在 Spring MVC 中直接用方法中的參數就可以,比如以下代碼:
重新運行程序后,我們使用 Postman 進行傳參:
填好對應的 URL 后,對剛剛代碼中的參數進行傳參:
修改請求方式為 GET ,并且發送:
咱們使用瀏覽器發送請求并傳參:
http://127.0.0.1:8080/request/r1?keyword=手機
可以看到,后端程序正確拿到了 keyword 參數的值;
Spring MVC 會根據方法的參數名,找到對應的參數,賦值給方法
如果參數不一致,是獲取不到參數的.
比如請求URL:http://127.0.0.1:8080/request/r1?keyword666=手機
響應結果:
(3) 傳遞簡單類型或包裝類型參數的注意事項
使用基本類型來接收參數時,參數必須傳
(除boolean類型),否則會報500錯誤
;
類型不匹配
時,會報400錯誤
但是類型不匹配
是針對簡單類型
的;
對于如下 r1 方法的參數類型 String 等包裝類型
,哪怕傳參不是 String 類型,也不會報錯:
(4) 基本類型的參數不傳遞
對于如上代碼,我們在請求中正常傳遞參數的 URL 如下:
http://127.0.0.1:8080/request/r2?age=18
瀏覽器響應情況:
通過Fiddler觀察請求和響應,HTTP響應狀態碼為200,Content-Type
為 text/html
正常鏈接:http://127.0.0.1:8080/request/r2?age=18
不傳參數:http://127.0.0.1:8080/request/r2
瀏覽器響應情況:
通過 Fiddler 觀察請求和響應,HTTP響應狀態碼為500
嘗試觀察程序的錯誤日志,并解決
查看日志堆棧信息的首行,報錯信息顯示:
- int類型的參數’age’,雖然為可選的,但由于被聲明為
基本類型而不能轉換為空值
;- 考慮將其聲明為對應
基本類型的包裝類型
;
按照錯誤信息解決錯誤即可:
最開始學習時,會遇到各種各樣的問題,我們要養成看錯誤日志的習慣,根據錯誤日志來解決問題.
最開始可能會看不懂,或者比較懵,要耐下心來,慢慢看,后面課堂中也會教大家更多看日志的思路;
(5) 基本類型的參數傳遞時類型不匹配
http://127.0.0.1:8080/request/r2?age=abcd
瀏覽器響應情況:
通過 Fiddler 觀察請求和響應,HTTP響應狀態碼為 400
對于包裝類型,如果不傳對應參數,Spring 接收到的數據則為 null;如果我們傳遞的值,不符合參數的包裝類型,也是可以拿到傳遞的值的
所以企業開發中,對于參數可能為空的數據,建議使用包裝類型
2. 傳遞多個參數
(1) 正常傳遞多個參數
如何接收多個參數呢?
和接收單個參數一樣,直接使用方法的參數接收即可,使用多個形參.
打開 Postman 發送請求:
使用瀏覽器發送請求并傳參:
http://127.0.0.1:8080/request/r3?userName=練習時長&password=“365365183”
可以看到,后端程序正確拿到了 name 和 password 參數的值
當有多個參數時,前后端進行參數匹配時,是以參數的名稱進行匹配的,因此參數的位置是不影響后端獲取參數的結果
;
比如訪問:
http://127.0.0.1:8080/request/r3?password=“365365183”&userName=練習時長
同樣可以拿到正端獲取參數的結果:
(2) 完善登錄細節
上述使用的是 GET 請求,但是對于登錄操作,一般把用戶信息放在 body 中,所以一般使用 POST
請求 (GET
也可以有 body):
說明:
- 在 Postman 中,選擇
POST
方式,并且選擇表單提交
的content-type
,如上圖- 登錄操作一般都是選擇使用
POST
,這樣參數就會在body
中上傳
(3) 使用 Postman 發送請求的細節規范
在響應的內容中,我們看見, userName 和 password 都輸出了兩份,因為我們在 Postman 中發送請求的方式不規范:
在選擇欄中出現一個以上的綠點,說明請求發送的次數大于一次;
在上面的這個請求中,就是在 URL 中輸入了一次數據,在 body 中又輸入了一次數據,響應就會輸出兩份數據;
因此,我們要確保只有一個綠點;
我們關掉其中一個綠點,再次發送請求,可以發現響應結果恢復正常:
或者我們刪除 URL 中的 Params
中的鍵值對:
刪除后,發現 Params
綠點消失,并且信息不再出現在 URL 中,再次發送請求,響應結果也恢復正常:
(4) 使用 GET 和 POST 的細節
GET |
剛剛我們談到,GET 一般沒有 body ,因此參數一般放在 URL 中,但是 GET 也可以有 body:
抓包結果:
雖然響應的結果可以看出,在這次 GET 響應中沒有拿到參數,但是 GET 請求中已經拿到了參數;
只是 GET 請求的參數一般在首行 URL 部分,而不再下面的 body ,所以為了規范,一般 GET 沒有 body
POST |
如果我們使用 POST ,參數也可以設置在 URL ,而不設置在 body
查看抓包結果:
因此,如果我們不按照規定使用,如把參數放在 GET 請求的 body
位置,可能在響應中就拿不到參數的值,因此,我們要按照規定使用 GET
和 POST
;