哈囉大家好,我是古古。
在上一篇文章中,我們先介紹了 Http 協議的用途,也介紹了 Http request 和 Http response 的格式規範,並且也有實際到 API Tester 中,練習去發起一個 Http request、以及查看 Http response 的返回值。
那麼這篇文章,我們就會回到 Spring MVC 中,來介紹要如何使用 @RequestMapping
,將 url 路徑對應到 Spring Boot 程式的方法上。
在我們開始介紹 @RequestMapping
的用法之前,我們先回顧一下 Http 協議的用途是什麼。
Http 協議的目的,是去「規定資料的傳輸格式,讓前端和後端能夠有效的進行資料溝通」,因此前後端就必須要按照 Http 協議的規定,去傳輸資料給對方。
而在 Http 協議中,可以分為 「Http Request(請求)」 和 「Http Response(回應)」 兩個部分,而一個 Http request 加上一個 Http response,就可以組合成一次完整的 Http 溝通。
另外 Http request 和 Http response 在使用上,也是有固定的格式規範的,具體的格式可以參考下面這張圖:
在大概了解了 Http request 和 Http response 之後,那麼這篇文章要介紹的,就是 Http request 中的 url 的部分。
當我們發起一個 Http request 時,我們需要指定 url 的值,才能夠告訴 API Tester,這一次的請求要發送到哪裡去。
而這個 url,其實就是我們平常在使用瀏覽器時,在上方網址列中會出現的這一串文字,也就是一般所俗稱的「網址」。
所以其實我們在日常生活中,是很常去使用 url 的!不過 url 在使用上,也是有固定的格式規範要遵守的,因此接下來我們就來看一下,url 的格式規範為何。
Url 本身其實是可以拆解成許多部分,譬如說以我們在前面的文章中常常輸入的網址 http://localhost:8080/test 為例,這個 url 其實是由以下幾個部分所組成:
首先在 url 的最前面,就會呈現這個 url 所使用的協議是什麼。
像是在這個例子中,我們所使用的就是「Http 協議」。
在協議的後面,會有一個 ://
做為分隔,接著後面所寫上的就是這個 url 的「域名」。
像是在上面的例子中,這個 url 的域名就是「localhost」。
而在域名的後面,就是這個 url 所使用的 port(端口)。如果在域名的後面有加上一個 :
,並且在 :
後面有加上一個數字的話,那這個數字就是 url 所使用的 port。
所以像是在上面的例子中,因為在 :
後面有寫上 8080,因此就表示這個 url 所使用的 port 為 8080。
不過在某些情況下,port 有時候可以省略不用寫,所以大家有時候在某些 url 中會看到 port、有時候又看不到,這個是正常的現象。
補充:port 的概念稍微進階一點,因此建議大家先有個印象就好,基本上在這個系列文中不會再對 port 有更多的深入介紹,因此大家就只要先知道有這個東西存在即可。
而在 port 之後的東西,就非常重要了!!
當我們在 port 的後面,再加上一個斜線 /
之後(或是沒有 port 的話,就是在域名後面的斜線 /
),從這個斜線 /
之後的所有東西,就是這個 url 的路徑。
因此像是在上面的例子中,url 路徑的值就是 /test
。
url 路徑的概念非常重要,他會決定這個 url 最終要去對應到 Spring Boot 程式中的哪一個方法上,因此大家在開發 Spring Boot 程式之前,一定要先搞懂「url 路徑」是位於整條 url 中的哪個部分,這樣子後續在實作 Spring Boot 程式時,才能夠更清楚了解他們之間的對應關係。
因為 url 路徑實在是太重要了,他是在實務上使用頻率非常高的一項技術,因此這邊我們就多舉幾個例子,來讓大家更了解 url 路徑的計算方式。
舉例來說,如果有一個 YouTube 的 url 如下:
https://www.youtube.com/channel/UC3yK8-EsoU7vZNiLnuep1tQ/videos
那麼這一條 url,就可以拆分成下圖所示,所以 url 路徑的值就會是 /channel/UC3yK8-EsoU7vZNiLnuep1tQ/videos
。
再舉一個例子,假設有另一個 Instagram 的 url 如下:
https://www.instagram.com/p/CHNDtIVl_BS
那麼這一條 url 就可以拆分成如下圖所示,所以 url 路徑的值就會是 /p/CHNDtIVl_BS
。
在了解了 url 的格式規範、以及了解如何「計算 url 的路徑」之後,那麼我們就可以進到這篇文章的重頭戲,也就是來介紹要如何使用 @RequestMapping
,將 url 路徑對應到 Spring Boot 程式的方法上了。
所以回到我們最一開始的例子(也就是 http://localhost:8080/test),對於這個 url 來說,他的 url 路徑就是最後面的 /test
。
如果我們想要將這個 /test
的 url 路徑,去對應到 Spring Boot 的方法上的話,那我們就只要使用 @RequestMapping
這個註解就可以達成了!
舉例來說,當我們在 MyController 中的 test()
方法上:
@RequestMapping
/test
只要完成上面這兩個步驟,就可以將 url 路徑 /test
,去對應到下面的 test()
方法上了!!
所以這時候,當前端發出一個 Http request、並且他的 url 路徑為 /test
時,那麼 Spring Boot 就會去找到這個 @RequestMapping("/test")
這一行程式,並且去執行他下面的 test()
方法了,所以這個就是「url 路徑的對應」,也就是 @RequestMapping
的運作邏輯了!
在使用 @RequestMapping
去對應 url 的路徑時,有一個非常重要的前提一定要滿足,就是該 class 上面一定要加上 @Controller
或是 @RestController
,這樣 @RequestMapping
才會真的生效;否則的話,@RequestMapping
是完全沒有作用的!
所以像是在上面的例子中,我們就有先在 MyController 上面加上一個 @RestController
,也是因為我們有預先加好了 @RestController
,因此 @RequestMapping
才會真的生效。
所以大家在使用 @RequestMapping
時,一定要記得,要在 class 上面加上 @Controller
或是 @RestController
,這樣子@RequestMapping
才會真的生效!
補充:後續的文章會再介紹
@Controller
和@RestController
的差別,所以大家現在就只要先記得,如果想要讓@RequestMapping
生效的話,就一定要在 class 上面加上@Controller
或@RestController
其中一個就對了。
看完了上述對 @RequestMapping
的介紹之後,接著我們也可以實際到 Spring Boot 程式中,來練習一下 @RequestMapping
的用法。這裡建議大家可以多練習幾次,因為 @RequestMapping
的概念可以說是非常的重要,因此掌握好他的用法是會有很大的幫助的!
在 Spring Boot 的程式中,目前我們已經有在 MyController 的 test()
方法上,有去添加一個 @RequestMapping
了,並且在後面的小括號中,我們寫上了 /test
,他的意思就是表示「我們要將 /test
這個 url 路徑,去對應到下面的 test()
方法上」。
確認好上述的程式之後,接著我們也可以運行一下這個 Spring Boot 程式,來看一下效果。
當成功運行 Spring Boot 程式之後,接著我們回到 API Tester 中,並且在 url 的地方,輸入 http://localhost:8080/test,表示我們要去請求 http://localhost:8080/test 這個 url。
因此當我們按下 Send 鍵之後,這時候這個 url 路徑 /test
,就會命中 MyController 中的 @RequestMapping("/test")
註解,因此到時候,Spring Boot 就會去執行他下面的 test()
方法,並且回傳「Hello World」的資訊給前端了。
所以這也是為什麼當我們按下 Send 鍵時,就會在 Response body 中出現「Hello World」的結果,背後就是 Spring Boot 程式去執行了 test()
方法,並且將他的返回值回傳給前端。
練習完上述的請求之後,我們也可以試著在 MyController 中,再去創建一個新的 url 路徑對應來練習看看。
像是我們可以在 MyController 中,再新增一個方法,這個方法的名字就叫做 product()
,並且我們在他上面加上 @RequestMapping("/product")
這一行程式。
@RequestMapping("/product")
public String product() {
return "第一個是蘋果、第二個是橘子";
}
當我們這樣子寫的話,就表示我們 「新增了一個 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()
方法的返回值「第一個是蘋果、第二個是橘子」的資訊了!
所以透過 @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 的用法,歡迎參考課程簡介 (輸入折扣碼「HH202504KU」即可享 85 折優惠)。