目錄

Day 20 - 取得請求參數(下)- @RequestHeader、@PathVariable

古古

2024/07/20


哈囉大家好,我是古古。

在上一篇文章中,我們有分別介紹 @ReqestParam@RequestBody 的用法,了解要如何透過 @ReqestParam 取得 url 後面的參數,以及如何透過 @RequestBody 取得 request body 中的 JSON 數據。

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

補充:想了解 @ReqestParam@RequestBody 的用法的話,可以參考上一篇文章 Day 19 - 取得請求參數(上)- @RequestParam、@RequestBody 的介紹。

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

@ReqeustHeader 的用途,就是「接住放在 request header 中的參數」。

雖然一般在開發上,不太會使用到 request header 來傳遞一般的參數(通常只有「權限驗證」或是「通用資訊」,才會使用 request header 來傳遞),不過我們仍舊可以來看一下 @RequestHeader 的用途為何,先對這個註解有個印象。

在 Spring Boot 中練習 @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 中的參數的值了。

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

在介紹完前面三個註解 @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 的應用場景為何」。

在 Spring Boot 中練習 @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 路徑」和「參數的名字」要一致 #

在使用 @PathVariable 去取得 url 路徑中的值的時候,有一點一定要特別注意,就是「url 路徑」和「參數的名字」必須要一致才可以。

舉例來說,如果我們在 @RequestMapping 中設定的 url 路徑為 /test4/{id},那麼在方法中所定義的參數名字,就也必須要定義成 id 才可以

所以假設當我們在 @RequestMapping 中設定的 url 路徑為 /test4/{age} 時,那麼參數的名字,也必須一起改成 age 才可以。

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

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

使用 @PathVariable 的第二個注意事項,就是「參數的類型需要一致」。

這部分其實就跟之前的 @RequestParam 很類似,譬如說 url 路徑中的值是 /test4/123,那就是暗示 /test4/{id} 中的 id 的值是 123,所以我們就要將 id 參數宣告為 Integer 或是 int 類型,這樣子才能夠成功的取得到 url 路徑中的值。

小結:@PathVariable 用法總結 #

綜合以上的介紹,我們也可以來總結一下 @PathVariable 的用法。

@PathVariable 的用途,就是「接住放在 url 路徑中的值」,這句話的重點在於**「url 路徑」**,這也是 @PathVariable 和其他三個註解最不一樣的地方。

而在使用 @PathVariable 時,要注意以下的事項:

  • 「url 路徑」和「參數的名字」要一致
  • 參數的類型要一致

只要注意好上面兩個注意事項,就可以成功的運用 @PathVariable,去取得 url 路徑中的值了!

補充:為什麼我們需要 @PathVariable? #

了解了 @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 中的四種取得參數的註解了,分別是:

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

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

而在我們更了解 Spring MVC 的用法之後,接著下一篇文章,我們就會來介紹現今前後端開發非常流行的一種設計風格,也就是 RESTful API,那我們就下一篇文章見啦!

補充:本文是擷取自我開設的線上課程 Java 工程師必備!Spring Boot 零基礎入門 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介 (輸入折扣碼「HH202504KU」即可享 85 折優惠)。