哈囉大家好,我是古古。
在上一篇文章中,我們有分別介紹 @ReqestParam
和 @RequestBody
的用法,了解要如何透過 @ReqestParam
取得 url 後面的參數,以及如何透過 @RequestBody
取得 request body 中的 JSON 數據。
那麼這篇文章,我們就會接著來介紹另外兩個取得請求參數的註解,也就是 @RequestHeader
和 @PathVariable
,那我們就開始吧!
補充:想了解
@ReqestParam
和@RequestBody
的用法的話,可以參考上一篇文章 Day 19 - 取得請求參數(上)- @RequestParam、@RequestBody 的介紹。
@ReqeustHeader
的用途,就是「接住放在 request header 中的參數」。
雖然一般在開發上,不太會使用到 request header 來傳遞一般的參數(通常只有「權限驗證」或是「通用資訊」,才會使用 request header 來傳遞),不過我們仍舊可以來看一下 @RequestHeader
的用途為何,先對這個註解有個印象。
首先因為 request header 是不論使用哪一種 Http 請求都可以添加的參數,所以換句話說畫的,即是 GET、POST、PUT、DELETE…等請求,都可以添加 request header 的通用參數。
舉例來說,如果前端在請求時,想要在 request header 中添加參數的話,那麼就可以在 API Tester 中,先去點擊 Add header 的按鈕,這樣子就可以去添加一個新的 request header 出來。
在點擊 Add header 按鈕之後,就會出現一對 key-value 的格子讓我們填寫(沒錯 request header 也是使用 key 和 value 的方式來存放的),因此左邊就是這個 request header 的名字(也就是 key),而右邊就是這個 header 的值(也就是 value)。
所以像是在下圖中,info
就是這個 request header 的 key、而 hello
就是他的 value 值。
當我們這樣填寫之後,前端到時候在請求時,就會將 info: hello
這個 request header 的 key: value
的資訊,去傳遞給後端了。
而當前端傳遞了 request header 的資訊過來之後,如果我們想要在 Spring Boot 中去接住這個 info: hello
的 request header 的值的話,那麼我們就可以像下圖一樣,在 test3()
方法的實作中,先新增一個 String 類型的參數 info,並且在 info 前面加上一個 @RequestHeader
,這樣子就可以成功的取得到前端傳遞過來的 header 的值了!
所以如果我們實際到 Spring Boot 上練習的話,就只要在 MyController 中,新增一個新的 test3()
方法,並且在裡面寫上下列的程式,這樣就可以取得前端所傳遞過來的 header 的值。
@RequestMapping("/test3")
public String test3(@RequestHeader String info) {
System.out.println("info 的值為: " + info);
return "請求成功";
}
實作完 MyController 之後,接著就運行一下 Spring Boot 程式。
運行成功之後,就回到 API Tester 中,並且在 Http method 中選擇 GET 請求(其實選擇哪一種請求方法都可以,此處以 GET 為例),url 的地方填上 http://localhost:8080/test3,然後 request header 的地方新增 info: hello
這組數據,這樣就可以模擬前端的請求。
這時當我們按下 Send 鍵之後,在右下角的 response body 中,就會出現 Spring Boot 所回傳的「請求成功」的訊息。
而當我們回到 IntelliJ 上查看的話,在下方的 console 中,就會出現「info 的值為: hello」的字串。
所以這就表示,我們就成功的透過 @RequestHeader
,接住前端放在 request header 中所傳遞的參數了!因此大家以後就可以透過這個寫法,去取得 request header 中的參數的值了。
在介紹完前面三個註解 @RequestParam
、@RequestBody
、@RequestHeader
之後,最後我們要來介紹第四個註解,也是跟其他人長得最不一樣的註解,即是 @PathVariable
(前面的註解都是以 @Request...
開頭,只有他是以 @Path...
開頭)。
@PathVariable
的用途,就是「接住放在 url 路徑中的值」,這句話的重點在於**「url 路徑」**,這也是 @PathVariable
和其他三個註解最不一樣的地方。
舉例來說,假設我們今天有一個 url 如下:
http://localhost:8080/test4/123
在這段 url 網址中,他的 url 路徑的值為 /test4/123
,而如果我們想要取得到 url 路徑 /test4/123
中的 123
的值的話,那麼就要透過 @PathVariable
來取得。
補充:此處大家先不用思考「為什麼我們需要讀取 url 路徑中的值?」,只要先學習
@PathVariable
的使用方法就好,後續會再回頭來解釋「為什麼我們需要@PathVariable
?」以及「@PathVariable
的應用場景為何」。
大概了解了 @PathVariable
的概念之後,我們也可以實際到 Spring Boot 中,來練習一下 @PathVariable
的用法。
舉例來說,假設前端今天請求了 http://localhost:8080/test4/123 這個 url,那麼在這個 url 裡面,他的 url 路徑即是 /test4/123
。
而如果我們想要在 Spring Boot 中,去接住 url 路徑 /test4/123
中的 123
的值的話,就必須要做兩件事:
首先我們要先修改一下 @RequestMapping
的寫法,即是將 @RequestMapping
所對應的 url 路徑,改寫成 @RequestMapping("/test4/{id}")
,這樣子 Spring Boot 才能夠將 /test4/123
的 url 路徑,去對應到 test4()
方法上。
接著我們就可以在 test4()
的方法中,去添加一個 Integer 類型的參數 id,並且在 id 前面加上一個 @PathVariable
,這樣子到時候,這個 id 的值就會是 url 路徑中的 123
,因此就可以成功的取得到 url 路徑(/test4/123
)中的 123
的值了!
所以如果我們將這段 test4()
的方法實作到 MyController 中的話,就可以寫成下面這個樣子:
@RequestMapping("/test4")
public String test4(@PathVariable Integer id) {
System.out.println("id 的值為: " + id);
return "請求成功";
}
修改好 MyController 之後,接著重新運行一下 Spring Boot 程式。
運行成功之後,就可以回到 API Tester,然後在 Http method 中選擇 GET 請求,url 填上 http://localhost:8080/test4/123,就可以模擬前端的請求。
這時當我們按下 Send 鍵之後,在右下角的 response body 中,就會出現 Spring Boot 所回傳的「請求成功」的訊息。
而當我們回到 IntelliJ 上查看的話,在下方的 console 中,就會出現「id 的值為: 123」的字串。
所以這就表示,我們就成功的透過 @PathVariable
,去接住前端放在 url 路徑中的值了!
在使用 @PathVariable
去取得 url 路徑中的值的時候,有一點一定要特別注意,就是「url 路徑」和「參數的名字」必須要一致才可以。
舉例來說,如果我們在 @RequestMapping
中設定的 url 路徑為 /test4/{id}
,那麼在方法中所定義的參數名字,就也必須要定義成 id
才可以
所以假設當我們在 @RequestMapping
中設定的 url 路徑為 /test4/{age}
時,那麼參數的名字,也必須一起改成 age
才可以。
所以簡單來說,就是「url 路徑」和「參數的名字」一定要一致就對了!
使用 @PathVariable
的第二個注意事項,就是「參數的類型需要一致」。
這部分其實就跟之前的 @RequestParam
很類似,譬如說 url 路徑中的值是 /test4/123
,那就是暗示 /test4/{id}
中的 id
的值是 123,所以我們就要將 id
參數宣告為 Integer 或是 int 類型,這樣子才能夠成功的取得到 url 路徑中的值。
綜合以上的介紹,我們也可以來總結一下 @PathVariable
的用法。
@PathVariable
的用途,就是「接住放在 url 路徑中的值」,這句話的重點在於**「url 路徑」**,這也是 @PathVariable
和其他三個註解最不一樣的地方。
而在使用 @PathVariable
時,要注意以下的事項:
只要注意好上面兩個注意事項,就可以成功的運用 @PathVariable
,去取得 url 路徑中的值了!
了解了 @PathVariable
的用法之後,我們也可以回頭來解釋一下,為什麼我們需要實作「從 url 路徑中取得值」這種行為。
假設前端想要傳遞「id 為 123」的資訊給 Spring Boot 的話,那麼前端完全可以使用上一篇文章所介紹的 @RequestParam
來傳遞,直接把 id=123
的資訊加在 url 最後面來傳遞就好了(如下圖左),為什麼要大費周章把 123 的值放到 url 路徑裡面,然後再透過 @PathVariable
來取得呢(如下圖右)?
之所以會使用 @PathVariable
來傳遞參數的根本原因,就是「為了支援 RESTful API 的設計風格」!
所謂的 RESTful API,他是在現今前後端開發中,非常流行的一種設計風格,而為了讓 Spring Boot 也能夠開發出符合 RESTful API 的設計風格,因此 Spring Boot 就設計出了 @PathVariable
這個註解,讓我們有能力去取得 url 路徑中的值。
有關 RESTful API 的設計風格,在下一篇文章就會跟大家詳細的介紹了,所以大家只要先知道 @PathVariable
是真的在實務上很常使用的註解即可,在下一篇文章就會詳細介紹 RESTful API 的使用方法,以及如何將 @PathVariable
套用在 RESTful API 的設計風格上!
這篇文章我們先延續上一篇文章,詳細的介紹了後兩個註解 @RequestHeader
和 @PathVariable
的用法,了解要如何透過 @RequestHeader
取得 request header 中的參數,以及要如何透過 @PathVariable
取得 url 路徑中的值。
所以到這邊為止,我們就詳細介紹完 Spring Boot 中的四種取得參數的註解了,分別是:
@RequestParam
:接住放在 Url 後面的參數@RequestBody
:接住放在 request body 中的參數@RequestHeader
:接住放在 request header 中的參數@PathVariable
:取得放在 url 路徑中的值因此大家之後就可以根據不同的情境,去選擇不同的註解,進而去取得到前端傳遞給我們的參數了!
而在我們更了解 Spring MVC 的用法之後,接著下一篇文章,我們就會來介紹現今前後端開發非常流行的一種設計風格,也就是 RESTful API,那我們就下一篇文章見啦!
補充:本文是擷取自我開設的線上課程 Java 工程師必備!Spring Boot 零基礎入門 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介 (輸入折扣碼「HH202504KU」即可享 85 折優惠)。