賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架
哈囉大家好,我是古古
上一篇文章有介紹到,要如何透過 @ReqestParam
和 @RequestBody
這兩個註解,分別去取得前端放在 url 最後面的參數、以及取得前端放在 request body 中的參數
那麼接著這篇文章,就會來介紹另外兩個取得請求參數的註解,也就是 @RequestHeader
和 @PathVariable
在 Spring Boot 中,有四個註解可以去接住前端的參數,分別是:
這四個註解雖然長得滿像的(都是以 @Request 開頭),但是他們功能是完全不同的
上一篇文章有介紹了前兩個註解 @RequestParam
以及 @RequestBody
,所以這篇文章就會接著來介紹後兩個註解,也就是 @RequestHeader
以及 @PathVariable
補充:還沒看過上一篇文章的可由此去 Day 19 - 取得請求參數 (上) - @RequestParam、@RequestBody
@RequestHeader
的用途,就是去 「接住那些放在 request header 中的參數」
雖然我們在前面的文章中沒有特別介紹 request header 的用途,不過其實前端也是可以在 request header 中傳遞參數給後端的(通常前端是會將「權限認證」或是「通用資訊」,放在 request header 中傳遞)
而在 request header 中,他的參數也是透過 key 和 value 的方式來存放的,像是大家如果打開 API Tester,就可以看到在上方的請求區塊中,有一個 Add header 的按鈕,可以去添加一個新的 request header 出來
點擊 Add header 按鈕之後,就會出現一對 key-value 的格子讓我們填寫,左邊就是這個 request header 的名字(也就是 key),而右邊就是這個 header 的值(也就是 value)
因此到時候前端就可以把這個 info: hello
的 request header 的資訊,一起透過 Http 請求傳遞給後端了
假設前端透過上面的方式,將 request header 傳遞過來之後,那我們在 Spring Boot 後端中,如果想要去接住這個 header 的值的話,就只需要在 test3() 方法中,去新增一個 String 類型的參數 info,並且在這個參數的前面,去加上一個 @RequestHeader
就可以了
這樣到時候,Spring Boot 就會自動把 info 這個 request header 的值,去儲存 test3() 方法的參數 info 中,因此我們就可以成功的取得到,前端傳遞過來的 request header 的值了!
了解了前面三個註解之後,最後一個接住前端參數的註解是 @PathVariable
,而 @PathVariable
這個註解,通常是大家一開始最搞不懂的註解(這裡的不懂是搞不懂到底要他有何用的那種XD)
我們可以先來看一下 @PathVariable
的用途,@PathVariable
的用途,就是去 「接住那些放在 url 路徑中的值」,這句話的重點在於「url 路徑」
舉例來說,假設我們今天有一個 url 如下
http://localhost:8080/test4/123
如果你想要取得到 url 路徑 /test4/123
中的 123 的值的話,那就可以透過 @PathVariable
來取得
補充:此處我們先介紹怎麼取得,後面再來介紹為什麼要搞得這麼複雜
一樣是上面的例子,假設我們今天有一個 url 如下
http://localhost:8080/test4/123
並且我們在 Spring Boot 裡面,想要去取得到 url 路徑 /test4/123
中的 123 的值的話,那我們必須要做以下這兩件事情:
首先是在使用 @RequestMapping
去定義 url 路徑時,先將 url 路徑定義成 "/test4/{id}"
,這樣到時候 Spring Boot 就能夠把上述的 url,去給對應到 test4() 方法上
接著,就是在 test4() 的方法中,去添加一個 Integer 類型的參數 id,並且在這個參數的前面,去加上一個 @PathVariable
這樣到時候,這個 id 的值就會是 123,因此我們就成功的取得到 url 路徑中的 {id}
的值了!
在使用 @PathVariable
去取得 url 路徑中的值的時候,一定要讓「url 路徑」和「參數」的名字一致才可以
譬如說這個例子中我們在 url 路徑中是寫成 /test4/{id}
,所以在參數部分就是要寫成 id
,如果我們今天在 url 路徑中是寫成 /test4/{age}
的話,那麼在參數部分,就是要同步把名字換成 age
所以簡單的說的話,就是「url 路徑」和「參數」的名字一定要是一致的就對了!
使用 @PathVariable
去取得 url 路徑中的值的第二個重點,就是「參數的類型需要一致」
這其實就跟之前的 @RequestParam
類似,譬如說 url 路徑中的值是 /test4/123
,那就是暗示 id 這個位子的值是 123,因此 id 這個參數的類型就必須是 Integer 或是 int,以此類推
補充:不過通常會使用到
@PathVariable
去取得 url 路徑中的值的情境,大部分都是 123 這種整數值,所以是還滿少用到其他類型的
了解了 @PathVariable
的用法之後,我們可以回頭來解釋一下,到底我們為什麼需要「從 url 路徑中去取得值」
大家可以想像一下,假設我們要傳遞 id 為 123 的參數給前端的話,其實完全可以使用上一篇文章介紹的 @RequestParam
來傳遞,就直接把 id=123
的資訊加在 url 最後面來傳就好了(如下圖左),到底為什麼要大費周章把 123 的值給塞到 url 路徑裡面,然後再透過 @PathVariable
來取得(如下圖右)
會這樣子做的根本的原因,就是「為了支援 RESTful API 的設計風格」!
RESTful API 是在現今前後端開發中,非常流行的一種設計風格,而 Spring 框架為了讓 Spring Boot 也能夠開發出符合 RESTful API 的設計風格,因此就設計出了 @PathVariable
,讓我們有能力去取得 url 路徑中的值
有關 RESTful API 的設計風格,會在下一篇文章跟大家詳細介紹,所以大家到這邊為止只要先大概知道,@PathVariable
是真的在實際的工作中會使用到的即可,就他不是一個來亂的註解XD,是真的會派上用場的~
詳細介紹完 Spring Boot 中取得參數的四個註解之後,我們可以最後來總結一下這四個註解的用法:
@RequestParam
:接住放在 Url 後面的參數@RequestBody
:接住放在 request body 中的參數@RequestHeader
:接住放在 request header 中的參數@PathVariable
:取得放在 url 路徑中的值因此大家之後就可以根據不同的情境,來選擇不同的註解,進而去取得到前端傳遞給我們的參數了!
這篇文章接續上一篇文章,詳細介紹了取得參數的後兩個註解:@RequestHeader
以及 @PathVariable
,並且也補充了為什麼我們需要 @PathVariable
的原因,最後也總結了一下 Spring Boot 中取得前端參數的四個註解
那麼在更了解 Spring MVC 的用法之後,接著下一篇文章,我們就會來詳細介紹前後端開發的一種風格模式,也就是 RESTful API,那我們就下一篇文章見啦!