iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Software Development

Spring Boot 零基礎入門系列 第 15

Spring Boot 零基礎入門 (15) - Url 路徑對應 - @RequestMapping

  • 分享至 

  • xImage
  •  

個人網站好讀版:Spring Boot 零基礎入門 系列文章

哈囉大家好,我是古古。

在上一篇文章中,我們先介紹了 Http 協議的用途,也介紹了 Http request 和 Http response 的格式規範,並且也有實際到 API Tester 中,練習去發起一個 Http request、以及查看 Http response 的返回值。

那麼這篇文章,我們就會回到 Spring MVC 中,來介紹要如何使用 @RequestMapping,將 url 路徑對應到 Spring Boot 程式的方法上。

回顧:什麼是 Http 協議?


在我們開始介紹 @RequestMapping 的用法之前,我們先回顧一下 Http 協議的用途是什麼。

Http 協議的目的,是去「規定資料的傳輸格式,讓前端和後端能夠有效的進行資料溝通」,因此前後端就必須要按照 Http 協議的規定,去傳輸資料給對方。

而在 Http 協議中,可以分為 「Http Request(請求)」「Http Response(回應)」 兩個部分,而一個 Http request 加上一個 Http response,就可以組合成一次完整的 Http 溝通。

另外 Http request 和 Http response 在使用上,也是有固定的格式規範的,具體的格式可以參考下面這張圖:

15-1.png

在大概了解了 Http request 和 Http response 之後,那麼這篇文章要介紹的,就是 Http request 中的 url 的部分。

什麼是 Url?


當我們發起一個 Http request 時,我們需要指定 url 的值,才能夠告訴 API Tester,這一次的請求要發送到哪裡去。

15-2.png

而這個 url,其實就是我們平常在使用瀏覽器時,在上方網址列中會出現的這一串文字,也就是一般所俗稱的「網址」。

15-3.png

所以其實我們在日常生活中,是很常去使用 url 的!不過 url 在使用上,也是有固定的格式規範要遵守的,因此接下來我們就來看一下,url 的格式規範為何。

Url 的格式規範


Url 本身其實是可以拆解成許多部分,譬如說以我們在前面的文章中常常輸入的網址 http://localhost:8080/test 為例,這個 url 其實是由以下幾個部分所組成:

15-4.png

1. 使用的協議

首先在 url 的最前面,就會呈現這個 url 所使用的協議是什麼。

像是在這個例子中,我們所使用的就是「Http 協議」。

2. 域名

在協議的後面,會有一個 :// 做為分隔,接著後面所寫上的就是這個 url 的「域名」。

像是在上面的例子中,這個 url 的域名就是「localhost」。

3. Port(端口)

而在域名的後面,就是這個 url 所使用的 port(端口)。如果在域名的後面有加上一個 :,並且在 : 後面有加上一個數字的話,那這個數字就是 url 所使用的 port。

所以像是在上面的例子中,因為在 : 後面有寫上 8080,因此就表示這個 url 所使用的 port 為 8080。

不過在某些情況下,port 有時候可以省略不用寫,所以大家有時候在某些 url 中會看到 port、有時候又看不到,這個是正常的現象。

補充:port 的概念稍微進階一點,因此建議大家先有個印象就好,基本上在這個系列文中不會再對 port 有更多的深入介紹,因此大家就只要先知道有這個東西存在即可。

4. url 路徑

而在 port 之後的東西,就非常重要了!!

當我們在 port 的後面,再加上一個斜線 / 之後(或是沒有 port 的話,就是在域名後面的斜線 /),從這個斜線 / 之後的所有東西,就是這個 url 的路徑。

因此像是在上面的例子中,url 路徑的值就是 /test

url 路徑的概念非常重要,他會決定這個 url 最終要去對應到 Spring Boot 程式中的哪一個方法上,因此大家在開發 Spring Boot 程式之前,一定要先搞懂「url 路徑」是位於整條 url 中的哪個部分,這樣子後續在實作 Spring Boot 程式時,才能夠更清楚了解他們之間的對應關係。

Url 的例子分析


因為 url 路徑實在是太重要了,他是在實務上使用頻率非常高的一項技術,因此這邊我們就多舉幾個例子,來讓大家更了解 url 路徑的計算方式。

例子一:YouTube 的 url 分析

舉例來說,如果有一個 YouTube 的 url 如下:

https://www.youtube.com/channel/UC3yK8-EsoU7vZNiLnuep1tQ/videos

那麼這一條 url,就可以拆分成下圖所示,所以 url 路徑的值就會是 /channel/UC3yK8-EsoU7vZNiLnuep1tQ/videos

15-5.png

例子二:Instagram 的 url 分析

再舉一個例子,假設有另一個 Instagram 的 url 如下:

https://www.instagram.com/p/CHNDtIVl_BS

那麼這一條 url 就可以拆分成如下圖所示,所以 url 路徑的值就會是 /p/CHNDtIVl_BS

15-6.png

Url 路徑對應:@RequestMapping


在了解了 url 的格式規範、以及了解如何「計算 url 的路徑」之後,那麼我們就可以進到這篇文章的重頭戲,也就是來介紹要如何使用 @RequestMapping,將 url 路徑對應到 Spring Boot 程式的方法上了。

所以回到我們最一開始的例子(也就是 http://localhost:8080/test) ,對於這個 url 來說,他的 url 路徑就是最後面的 /test

如果我們想要將這個 /test 的 url 路徑,去對應到 Spring Boot 的方法上的話,那我們就只要使用 @RequestMapping 這個註解就可以達成了!

舉例來說,當我們在 MyController 中的 test() 方法上:

  • 先加上 @RequestMapping
  • 並且在後面的小括號中,指定 url 路徑的值為 /test

只要完成上面這兩個步驟,就可以將 url 路徑 /test,去對應到下面的 test() 方法上了!!

15-7.png

所以這時候,當前端發出一個 Http request、並且他的 url 路徑為 /test 時,那麼 Spring Boot 就會去找到這個 @RequestMapping("/test") 這一行程式,並且去執行他下面的 test() 方法了,所以這個就是「url 路徑的對應」,也就是 @RequestMapping 的運作邏輯了!

使用 @RequestMapping 的注意事項:一定要在 class 上加上 @Controller 或是 @RestController

在使用 @RequestMapping 去對應 url 的路徑時,有一個非常重要的前提一定要滿足,就是該 class 上面一定要加上 @Controller 或是 @RestController,這樣 @RequestMapping 才會真的生效;否則的話,@RequestMapping 是完全沒有作用的!

所以像是在上面的例子中,我們就有先在 MyController 上面加上一個 @RestController,也是因為我們有預先加好了 @RestController,因此 @RequestMapping 才會真的生效。

所以大家在使用 @RequestMapping 時,一定要記得,要在 class 上面加上 @Controller 或是 @RestController,這樣子@RequestMapping 才會真的生效!

補充:後續的文章會再介紹 @Controller@RestController 的差別,所以大家現在就只要先記得,如果想要讓 @RequestMapping 生效的話,就一定要在 class 上面加上@Controller@RestController 其中一個就對了。

在 Spring Boot 中練習 @RequestMapping 的用法


練習 @RequestMapping 的用法

看完了上述對 @RequestMapping 的介紹之後,接著我們也可以實際到 Spring Boot 程式中,來練習一下 @RequestMapping 的用法。這裡建議大家可以多練習幾次,因為 @RequestMapping 的概念可以說是非常的重要,因此掌握好他的用法是會有很大的幫助的!

在 Spring Boot 的程式中,目前我們已經有在 MyController 的 test() 方法上,有去添加一個 @RequestMapping 了,並且在後面的小括號中,我們寫上了 /test他的意思就是表示「我們要將 /test 這個 url 路徑,去對應到下面的 test() 方法上」。

15-8.png

確認好上述的程式之後,接著我們也可以運行一下這個 Spring Boot 程式,來看一下效果。

當成功運行 Spring Boot 程式之後,接著我們回到 API Tester 中,並且在 url 的地方,輸入 http://localhost:8080/test ,表示我們要去請求 http://localhost:8080/test 這個 url。

15-9.png

因此當我們按下 Send 鍵之後,這時候這個 url 路徑 /test,就會命中 MyController 中的 @RequestMapping("/test") 註解,因此到時候,Spring Boot 就會去執行他下面的 test() 方法,並且回傳「Hello World」的資訊給前端了。

15-10.png

所以這也是為什麼當我們按下 Send 鍵時,就會在 Response body 中出現「Hello World」的結果,背後就是 Spring Boot 程式去執行了 test() 方法,並且將他的返回值回傳給前端。

新增一個 url 路徑對應

練習完上述的請求之後,我們也可以試著在 MyController 中,再去創建一個新的 url 路徑對應來練習看看。

像是我們可以在 MyController 中,再新增一個方法,這個方法的名字就叫做 product(),並且我們在他上面加上 @RequestMapping("/product") 這一行程式。

@RequestMapping("/product")
public String product() {
    return "第一個是蘋果、第二個是橘子";
}

15-11.png

當我們這樣子寫的話,就表示我們 「新增了一個 url 的路徑對應」,也就是將 url 路徑 /product,去對應到他下面的 product() 方法上。

實作完上述的程式之後,我們也可以重新運行一下 Spring Boot,來看一下效果(記得要重新運行一下 Spring Boot 程式,上述的改動才會成功的被運行起來)。

重新運行起 Spring Boot 程式之後,這時候我們可以回到 API Tester,並且將 url 改成 http://localhost:8080/product ,表示我們要去請求 /product 這個 url 路徑。

因此當我們按下 Send 鍵之後,Spring Boot 程式就會命中 MyController 中的 @RequestMapping("/product") 註解,並且去執行他下面的 product() 方法,因此最後就會在 Response body 中,呈現 product() 方法的返回值「第一個是蘋果、第二個是橘子」的資訊了!

15-12.png

所以透過 @RequestMapping 的用法,我們之後就可以不斷的在 Spring Boot 程式中,去添加新的 url 路徑對應出來了!

補充:在 Spring Boot 程式中,不管我們使用 @RequestMapping 創建了多少個 url 路徑對應出來,都是沒問題的!因此隨著專案不斷的推進,我們就會在同一個 Spring Boot 程式中越寫越多 @RequestMapping,這個是正常的現象。

不過當 Spring Boot 程式中的 url 路徑越寫越多時,這時就要小心,不要重複使用到之前已經被定義過的 url 路徑,因此大家在實作上,要特別注意一下這個細節。

而在一個 Spring Boot 程式中,有多少個 url 路徑對應都可以(Spring Boot 沒有限制),因此是有可能隨著專案的不斷推進,在該 project 中所寫的 url 路徑對應就越變越多這樣,這個現象是正常的,不過就變成大家後續在寫新的 url 路徑對應時,要小心不用重複使用到已經被定義過的 url 路徑

總結


這篇文章我們先介紹了 url 的格式規範是什麼,並且也介紹了要如何使用 @RequestMapping,將 url 的路徑對應到 Spring Boot 的方法上。

那麼下一篇文章,我們就會接著來介紹,要如何使用 JSON,結構化的去呈現數據,那我們就下一篇文章見啦!

補充:本文是擷取自我開設的線上課程 Java 工程師必備!Spring Boot 零基礎入門 的內容,如果你想了解更多的 Spring Boot 的用法,歡迎參考課程簡介。


上一篇
Spring Boot 零基礎入門 (14) - Http 協議介紹
下一篇
Spring Boot 零基礎入門 (16) - 結構化的呈現數據 - JSON 格式介紹
系列文
Spring Boot 零基礎入門30
.

尚未有邦友留言

立即登入留言