iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Software Development

Spring Boot 零基礎入門系列 第 15

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

  • 分享至 

  • xImage
  •  

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

哈囉大家好,我是古古

在上一篇文章中,有先介紹了 Http 協議的用途,以及 Http request 和 Http response 的格式,也有實際到 API Tester 中練習了如何發起一個 Http request

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

回顧:什麼是 Http 協議?


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

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

而有關 Http request 和 Http response,他們也是有固定的格式規範的,具體可以參考下面這張圖:

https://ithelp.ithome.com.tw/upload/images/20230930/20151036zG2r2udKKF.png

大概了解了 Http 協議中的 request 和 response 之後,這篇文章要來介紹的,就是 Http request 中的 url 的部分

什麼是 Url?


當我們在發起一個 Http request 時,除了指定 http method 要用的值之外,還會需要指定 url 的值

https://ithelp.ithome.com.tw/upload/images/20230930/20151036HamAop8VBA.png

而這個 url,其實就是我們平常在打開瀏覽器的時候,在上方網址列會出現的這一串字,中文是翻譯為網址

https://ithelp.ithome.com.tw/upload/images/20230930/20151036tucznCpBHY.png

所以在 Http request 中的 url 的值是非常重要的,因為他會關係著我們要去對哪一個網址發出 Http request,不同的網址會提供不同的功能,因此填寫正確的 url 的值非常重要

Url 的格式


url 本身其實是可以拆分成許多部分的,譬如說拿我們在前面的課程中常常輸入在網址列的 url http://localhost:8080/test 來當作範例的話,就可以觀察到 url 其實是由以下幾個部分所組成:

https://ithelp.ithome.com.tw/upload/images/20230930/20151036cbpa7diDZa.png

1. 使用的協議

在 url 的最前面,會顯示這個 url 所使用的是什麼協議,像是這邊使用的就是 http 協議

2. 域名

在協議後面會有一個 :// 做分隔,後面接著的就是這個 url 的域名,以這個例子來說的話,這個 url 的域名就是「localhost」

3. Port

Port 有時候可以省略,所以他不一定會出現,是一個可選項

不過只要看到域名後面有加上 :,並且在 : 後面有加上一個數字的話,那這個數字就是 url 所使用的 port,像是這邊在 : 後面就有寫上 8080,就表示這個 url 所使用的 port 就是 8080

4. url 路徑

而在 port 後面,會去加上一個斜線(或是沒有 port 的話,就是在域名後面的斜線),從這個斜線之後的所有東西,就是這個 url 的路徑,所以像是這個例子中,url 路徑的值就是 /test

這個 url 路徑非常的重要,基本上就是決定了要對應到 Spring Boot 中的哪個方法,因此大家在開發 Spring Boot 程式之前,首先一定要搞懂 url 路徑是從哪裡算到哪裡,這樣子後續在和 Spring Boot 中的方法去做對應時,才能夠更清楚了解他們之間的對應關係

Url 的例子分析


例子 1:YouTube 的 url 分析

舉例來說,如果有一個 YouTube 的 url 是 https://www.youtube.com/channel/UC3yK8-EsoU7vZNiLnuep1tQ/videos ,那麼他的 url 格式,就會如下圖中所拆分,所以 url 路徑的值,就會是 /channel/UC3yK8-EsoU7vZNiLnuep1tQ/videos

https://ithelp.ithome.com.tw/upload/images/20230930/20151036I2yOpM9K8b.png

例子 2:Instagram 的 url 分析

再舉一個例子,假設有另一個 Instagram 的 url 是 https://www.instagram.com/p/CHNDtIVl_BS ,那麼他的 url 格式,就會如下圖中所拆分,所以 url 路徑的值,就會是 /p/CHNDtIVl_BS

https://ithelp.ithome.com.tw/upload/images/20230930/20151036yYhSgDfaz5.png

Url 路徑對應:@RequestMapping


了解了 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 方法上

https://ithelp.ithome.com.tw/upload/images/20230930/201510362zjMbqGLfM.png

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

使用 @RequestMapping 的注意事項

在使用 @RequestMapping 去指定 url 路徑的對應時,是有一個非常重要的注意事項,就是該 class 上面一定要上加 @Controller 或是 @RestController,否則 @RequestMapping 不會生效

所以換句話說的話,如果大家只有在方法上面加上 @RequestMapping,但是沒有在 class 上面加上 @Controller 或是 @RestController 的話,那麼這個 @RequestMapping 是毫無作用的~

所以大家觀察一下也可以發現,在上面的 MyController class 中,是可以看到我們有加上一個 @RestController 在 class 上面的,也因為這樣,所以 @RequestMapping 才會生效

補充:有關 @Controller@RestController 的差別與用途,在後面的文章就會介紹,目前只要記得,想要讓 @RequestMapping 生效的話,一定得加上這兩個其中一個就對了

在 Spring Boot 中練習 @RequestMapping 的用法


目前我們在 MyController 中,在 test() 方法上面所添加的是 @RequestMapping("/test"),這表示了我們將 /test 這個 url 路徑去對應到 test() 方法上

https://ithelp.ithome.com.tw/upload/images/20230930/20151036sKqVHfWVba.png

@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」的資訊了

https://ithelp.ithome.com.tw/upload/images/20230930/20151036qs5Yjd3iAr.png

新增一個 url 路徑對應

如果我們嘗試在這個 MyController 中,再新增一個名字為 product() 的方法,並且在他上面加上 @RequestMapping("/product") 的註解的話,那麼就表示我們新增了一個 url 的路徑對應,將 url 路徑 /product 給對應到下面的 product() 方法

https://ithelp.ithome.com.tw/upload/images/20230930/201510369GYLqEFpXi.png

@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 中回傳「第一個是蘋果、第二個是橘子」的資訊了

https://ithelp.ithome.com.tw/upload/images/20230930/20151036bzqFA5DEfX.png

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

補充:MyController 回顧

在剛剛的練習中,我們在 MyController 中新增了一個新的 product() 方法,所以目前在這個 MyController 裡面,就有了兩個方法,分別是 test() 和 product(),所以在這個 Spring Boot 程式裡面,就有了 2 個 url 路徑對應

https://ithelp.ithome.com.tw/upload/images/20230930/20151036x2fZADLc9v.png

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

總結


這篇文章介紹了什麼是 url 以及 url 的格式,並且也介紹了要如何透過 @RequestMapping ,將 url 的路徑給對應到 Spring Boot 的方法上

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

相關連結



上一篇
Spring Boot 零基礎入門 (14) - Http 協議介紹
下一篇
Spring Boot 零基礎入門 (16) - Json 格式介紹
系列文
Spring Boot 零基礎入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言