賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架
哈囉大家好,我是古古
在上一篇文章中,有先介紹了 Http 協議的用途,以及 Http request 和 Http response 的格式,也有實際到 API Tester 中練習了如何發起一個 Http request
那麼接著這篇文章,我們就會回到 Spring MVC 中,介紹要如何透過 @RequestMapping
,將 url 路徑對應到 Spring Boot 程式的方法上
Http 協議的目的,是「規定資料的傳輸格式,讓前端和後端能夠有效的進行資料溝通」,因此前後端就必須要按照 Http 協議的規定,去傳輸資料給對方
在 Http 協議中,可以分為「Request (請求)」和「Response (回應)」兩部分,而一個 Http request 加上一個 Http response,就可以組合成一次完整的 Http 溝通
而有關 Http request 和 Http response,他們也是有固定的格式規範的,具體可以參考下面這張圖:
大概了解了 Http 協議中的 request 和 response 之後,這篇文章要來介紹的,就是 Http request 中的 url 的部分
當我們在發起一個 Http request 時,除了指定 http method 要用的值之外,還會需要指定 url 的值
而這個 url,其實就是我們平常在打開瀏覽器的時候,在上方網址列會出現的這一串字,中文是翻譯為網址
所以在 Http request 中的 url 的值是非常重要的,因為他會關係著我們要去對哪一個網址發出 Http request,不同的網址會提供不同的功能,因此填寫正確的 url 的值非常重要
url 本身其實是可以拆分成許多部分的,譬如說拿我們在前面的課程中常常輸入在網址列的 url http://localhost:8080/test 來當作範例的話,就可以觀察到 url 其實是由以下幾個部分所組成:
在 url 的最前面,會顯示這個 url 所使用的是什麼協議,像是這邊使用的就是 http 協議
在協議後面會有一個 ://
做分隔,後面接著的就是這個 url 的域名,以這個例子來說的話,這個 url 的域名就是「localhost」
Port 有時候可以省略,所以他不一定會出現,是一個可選項
不過只要看到域名後面有加上 :
,並且在 :
後面有加上一個數字的話,那這個數字就是 url 所使用的 port,像是這邊在 :
後面就有寫上 8080,就表示這個 url 所使用的 port 就是 8080
而在 port 後面,會去加上一個斜線(或是沒有 port 的話,就是在域名後面的斜線),從這個斜線之後的所有東西,就是這個 url 的路徑,所以像是這個例子中,url 路徑的值就是 /test
這個 url 路徑非常的重要,基本上就是決定了要對應到 Spring Boot 中的哪個方法,因此大家在開發 Spring Boot 程式之前,首先一定要搞懂 url 路徑是從哪裡算到哪裡,這樣子後續在和 Spring Boot 中的方法去做對應時,才能夠更清楚了解他們之間的對應關係
舉例來說,如果有一個 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 的路徑到底是從哪裡開始算之後,那麼我們就可以來看一下,要如何把這個 url 的路徑給對應到 Spring Boot 的方法中了
回到我們最一開始的例子 http://localhost:8080/test ,對這個 url 來說,他的 url 路徑就是最後面的 /test
如果想要將這個 /test
的 url 路徑,去對應到 Spring Boot 的方法上的話,我們就只要使用 @RequestMapping
這個註解就可以達成了!
譬如說當我們在 MyController 中的 test() 方法上,去加上 @RequestMapping
,並且在後面的小括號中指定 url 路徑的值 /test
,這樣就可以成功將 url 路徑 /test
給對應到下面的 test 方法上
所以當前端發出一個 Http request,並且他的 url 路徑為 /test
時,那麼 Spring Boot 就會去找到這個 @RequestMapping("/test")
,並且去執行他下面的 test 方法了,這就是 @RequestMapping
的運作邏輯!
在使用 @RequestMapping
去指定 url 路徑的對應時,是有一個非常重要的注意事項,就是該 class 上面一定要上加 @Controller
或是 @RestController
,否則 @RequestMapping
不會生效
所以換句話說的話,如果大家只有在方法上面加上 @RequestMapping
,但是沒有在 class 上面加上 @Controller
或是 @RestController
的話,那麼這個 @RequestMapping
是毫無作用的~
所以大家觀察一下也可以發現,在上面的 MyController class 中,是可以看到我們有加上一個 @RestController
在 class 上面的,也因為這樣,所以 @RequestMapping
才會生效
補充:有關
@Controller
和@RestController
的差別與用途,在後面的文章就會介紹,目前只要記得,想要讓@RequestMapping
生效的話,一定得加上這兩個其中一個就對了
目前我們在 MyController 中,在 test() 方法上面所添加的是 @RequestMapping("/test")
,這表示了我們將 /test
這個 url 路徑去對應到 test() 方法上
@RestController
public class MyController {
@RequestMapping("/test")
public String test() {
System.out.println("Hi!");
return "Hello World";
}
}
因此當前端發起了一個 Http request 到 http://localhost:8080/test 時,Spring Boot 就會透過 @RequestMapping("/test")
,找到這個 url 的路徑對應,並且去執行這個 test() 方法,在 response body 中回傳「Hello World」的資訊了
如果我們嘗試在這個 MyController 中,再新增一個名字為 product() 的方法,並且在他上面加上 @RequestMapping("/product")
的註解的話,那麼就表示我們新增了一個 url 的路徑對應,將 url 路徑 /product
給對應到下面的 product() 方法
@RestController
public class MyController {
@RequestMapping("/test")
public String test() {
System.out.println("Hi!");
return "Hello World";
}
@RequestMapping("/product")
public String product() {
return "第一個是蘋果、第二個是橘子";
}
}
因此當前端發起了一個 Http request 到 http://localhost:8080/product 時,Spring Boot 就會透過 @RequestMapping("/product")
,找到這個 url 的路徑對應,並且去執行這個 product() 方法,在 response body 中回傳「第一個是蘋果、第二個是橘子」的資訊了
所以大家之後就可以透過這個 @RequestMapping
的用法,不斷地在你的 Spring Boot 程式中去添加新的 url 路徑對應出來了!
在剛剛的練習中,我們在 MyController 中新增了一個新的 product() 方法,所以目前在這個 MyController 裡面,就有了兩個方法,分別是 test() 和 product(),所以在這個 Spring Boot 程式裡面,就有了 2 個 url 路徑對應
而在一個 Spring Boot 程式中,有多少個 url 路徑對應都可以(Spring Boot 沒有限制),因此是有可能隨著專案的不斷推進,在該 project 中所寫的 url 路徑對應就越變越多這樣,這個現象是正常的,不過就變成大家後續在寫新的 url 路徑對應時,要小心不用重複使用到已經被定義過的 url 路徑
這篇文章介紹了什麼是 url 以及 url 的格式,並且也介紹了要如何透過 @RequestMapping
,將 url 的路徑給對應到 Spring Boot 的方法上
那麼下一篇文章,我們就會接著來介紹,要如何使用 Json 去結構化的呈現數據,那我們就下一篇文章見啦!