iT邦幫忙

2023 iThome 鐵人賽

DAY 20
1
Software Development

Spring Boot 零基礎入門系列 第 20

Spring Boot 零基礎入門 (20) - 取得請求參數 (下) - @RequestHeader、@PathVariable

  • 分享至 

  • xImage
  •  

賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架

哈囉大家好,我是古古

上一篇文章有介紹到,要如何透過 @ReqestParam@RequestBody 這兩個註解,分別去取得前端放在 url 最後面的參數、以及取得前端放在 request body 中的參數

那麼接著這篇文章,就會來介紹另外兩個取得請求參數的註解,也就是 @RequestHeader@PathVariable

回顧:在 Spring Boot 中接住參數的四個註解


在 Spring Boot 中,有四個註解可以去接住前端的參數,分別是:

  1. @RequestParam
  2. @RequestBody
  3. @RequestHeader
  4. @PathVariable

這四個註解雖然長得滿像的(都是以 @Request 開頭),但是他們功能是完全不同的

上一篇文章有介紹了前兩個註解 @RequestParam 以及 @RequestBody,所以這篇文章就會接著來介紹後兩個註解,也就是 @RequestHeader 以及 @PathVariable

補充:還沒看過上一篇文章的可由此去 Day 19 - 取得請求參數 (上) - @RequestParam、@RequestBody

3. @RequestHeader:接住放在 request header 中的參數


@RequestHeader 的用途,就是去 「接住那些放在 request header 中的參數」

雖然我們在前面的文章中沒有特別介紹 request header 的用途,不過其實前端也是可以在 request header 中傳遞參數給後端的(通常前端是會將「權限認證」或是「通用資訊」,放在 request header 中傳遞)

https://ithelp.ithome.com.tw/upload/images/20231005/201510363aqEWErZnK.png

而在 request header 中,他的參數也是透過 key 和 value 的方式來存放的,像是大家如果打開 API Tester,就可以看到在上方的請求區塊中,有一個 Add header 的按鈕,可以去添加一個新的 request header 出來

https://ithelp.ithome.com.tw/upload/images/20231005/20151036aVWBGSIALn.png

點擊 Add header 按鈕之後,就會出現一對 key-value 的格子讓我們填寫,左邊就是這個 request header 的名字(也就是 key),而右邊就是這個 header 的值(也就是 value)

因此到時候前端就可以把這個 info: hello 的 request header 的資訊,一起透過 Http 請求傳遞給後端了

https://ithelp.ithome.com.tw/upload/images/20231005/20151036gStF0RfOPs.png

如何運用 @RequestHeader?

假設前端透過上面的方式,將 request header 傳遞過來之後,那我們在 Spring Boot 後端中,如果想要去接住這個 header 的值的話,就只需要在 test3() 方法中,去新增一個 String 類型的參數 info,並且在這個參數的前面,去加上一個 @RequestHeader 就可以了

這樣到時候,Spring Boot 就會自動把 info 這個 request header 的值,去儲存 test3() 方法的參數 info 中,因此我們就可以成功的取得到,前端傳遞過來的 request header 的值了!

https://ithelp.ithome.com.tw/upload/images/20231005/20151036pX3KrOFMGJ.png

4. @PathVariable:接住放在 url 路徑中的值


了解了前面三個註解之後,最後一個接住前端參數的註解是 @PathVariable,而 @PathVariable 這個註解,通常是大家一開始最搞不懂的註解(這裡的不懂是搞不懂到底要他有何用的那種XD)

我們可以先來看一下 @PathVariable 的用途,@PathVariable 的用途,就是去 「接住那些放在 url 路徑中的值」,這句話的重點在於「url 路徑」

舉例來說,假設我們今天有一個 url 如下

http://localhost:8080/test4/123

如果你想要取得到 url 路徑 /test4/123 中的 123 的值的話,那就可以透過 @PathVariable 來取得

補充:此處我們先介紹怎麼取得,後面再來介紹為什麼要搞得這麼複雜

如何運用 @PathVariable?

一樣是上面的例子,假設我們今天有一個 url 如下

http://localhost:8080/test4/123

並且我們在 Spring Boot 裡面,想要去取得到 url 路徑 /test4/123 中的 123 的值的話,那我們必須要做以下這兩件事情:

首先是在使用 @RequestMapping 去定義 url 路徑時,先將 url 路徑定義成 "/test4/{id}",這樣到時候 Spring Boot 就能夠把上述的 url,去給對應到 test4() 方法上

https://ithelp.ithome.com.tw/upload/images/20231005/201510363Zrw9AooTD.png

接著,就是在 test4() 的方法中,去添加一個 Integer 類型的參數 id,並且在這個參數的前面,去加上一個 @PathVariable

這樣到時候,這個 id 的值就會是 123,因此我們就成功的取得到 url 路徑中的 {id} 的值了!

https://ithelp.ithome.com.tw/upload/images/20231005/20151036btZnNiJZO3.png

使用 @PathVariable 的注意事項之一:「url 路徑」和「參數」的名字要一致

在使用 @PathVariable 去取得 url 路徑中的值的時候,一定要讓「url 路徑」和「參數」的名字一致才可以

譬如說這個例子中我們在 url 路徑中是寫成 /test4/{id},所以在參數部分就是要寫成 id,如果我們今天在 url 路徑中是寫成 /test4/{age} 的話,那麼在參數部分,就是要同步把名字換成 age

所以簡單的說的話,就是「url 路徑」和「參數」的名字一定要是一致的就對了!

使用 @PathVariable 的注意事項之二:參數類型需一致

使用 @PathVariable 去取得 url 路徑中的值的第二個重點,就是「參數的類型需要一致」

這其實就跟之前的 @RequestParam 類似,譬如說 url 路徑中的值是 /test4/123,那就是暗示 id 這個位子的值是 123,因此 id 這個參數的類型就必須是 Integer 或是 int,以此類推

補充:不過通常會使用到 @PathVariable 去取得 url 路徑中的值的情境,大部分都是 123 這種整數值,所以是還滿少用到其他類型的

補充:所以,為什麼我們需要 @PathVariable?

了解了 @PathVariable 的用法之後,我們可以回頭來解釋一下,到底我們為什麼需要「從 url 路徑中去取得值」

大家可以想像一下,假設我們要傳遞 id 為 123 的參數給前端的話,其實完全可以使用上一篇文章介紹的 @RequestParam 來傳遞,就直接把 id=123 的資訊加在 url 最後面來傳就好了(如下圖左),到底為什麼要大費周章把 123 的值給塞到 url 路徑裡面,然後再透過 @PathVariable 來取得(如下圖右)

https://ithelp.ithome.com.tw/upload/images/20231005/20151036Cz4wNGpkaN.png

會這樣子做的根本的原因,就是「為了支援 RESTful API 的設計風格」!

RESTful API 是在現今前後端開發中,非常流行的一種設計風格,而 Spring 框架為了讓 Spring Boot 也能夠開發出符合 RESTful API 的設計風格,因此就設計出了 @PathVariable,讓我們有能力去取得 url 路徑中的值

有關 RESTful API 的設計風格,會在下一篇文章跟大家詳細介紹,所以大家到這邊為止只要先大概知道,@PathVariable 是真的在實際的工作中會使用到的即可,就他不是一個來亂的註解XD,是真的會派上用場的~

小結:在 Spring Boot 中接住參數的四個註解


詳細介紹完 Spring Boot 中取得參數的四個註解之後,我們可以最後來總結一下這四個註解的用法:

  1. @RequestParam:接住放在 Url 後面的參數
  2. @RequestBody:接住放在 request body 中的參數
  3. @RequestHeader:接住放在 request header 中的參數
  4. @PathVariable:取得放在 url 路徑中的值

因此大家之後就可以根據不同的情境,來選擇不同的註解,進而去取得到前端傳遞給我們的參數了!

總結


這篇文章接續上一篇文章,詳細介紹了取得參數的後兩個註解:@RequestHeader 以及 @PathVariable,並且也補充了為什麼我們需要 @PathVariable 的原因,最後也總結了一下 Spring Boot 中取得前端參數的四個註解

那麼在更了解 Spring MVC 的用法之後,接著下一篇文章,我們就會來詳細介紹前後端開發的一種風格模式,也就是 RESTful API,那我們就下一篇文章見啦!

相關連結



上一篇
Spring Boot 零基礎入門 (19) - 取得請求參數 (上) - @RequestParam、@RequestBody
下一篇
Spring Boot 零基礎入門 (21) - RESTful API 介紹
系列文
Spring Boot 零基礎入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言