iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
Modern Web

起步Go!Let's Go!系列 第 24

[ Day 24 ] Go 路由:尋找正確的道路

  • 分享至 

  • xImage
  •  

在 Go 的網路應用程式開發中,路由是一個至關重要的部分。它決定了每一個收到的請求應該由哪個處理器函數處理,這樣你的應用程式就知道該如何回應不同的路徑。Go 提供了內建的 net/http 套件,其中包含了一個簡單而強大的路由機制。

為甚麼需要路由?

在 Web 開發中,一個網頁通常有多個頁面或端點,每個端點對應著不同的功能。路由就像是地圖上的指南針,指引著請求應該前往哪個處理器,它使得代碼更有組織性,易於擴展。

使用 net/http 的路由

Go 的 net/http 套件提供了一個名為 ServeMux 的類型,這是一個 HTTP 請求多路徑器。它可以將不同的路徑映射到不同的處理器函數。我們稍微修改一下昨天的例子:

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	pageVariables := PageVariables{
		Title:   "冒險開始",
		Message: "歡迎來到冒險之旅!",
	}

	tmpl, err := template.New("index").Parse(`
		<!DOCTYPE html>
		<html>
		<head>
			<title>{{.Title}}</title>
		</head>
		<body>
			<h1>{{.Title}}</h1>
			<p>{{.Message}}</p>
		</body>
		</html>
	`)

	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	err = tmpl.Execute(w, pageVariables)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
}

func aboutHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "This is the about page.")
}

func main() {
	mux := http.NewServeMux()

	mux.HandleFunc("/", handler)
	mux.HandleFunc("/about", aboutHandler)

	http.ListenAndServe(":8080", mux)
}

我增加了一個 aboutHandler 的函示,並在 main() 增加了一些東西,當 go build 完這支程式碼並執行後,我們到瀏覽器輸入 http://127.0.0.1:8080/ 後,我們可以看到頁面上出現跟昨天一樣的畫面,此時,在網址後面增加一個 about,這時,我們就可以看到 This is the about page.,這是因為homeHandler 函數處理根路徑 ("/") 的請求,而 aboutHandler 函數處理 "/about" 路徑的請求。如果再搭配昨天提到的 templete,你就可以將 HTML 模板與路由結合,以動態生成頁面內容。
about 頁面

動態路由參數

有時候,我們需要處理包含變數的路徑,例如,一個用戶的個人資料頁面可能是 "/user/{username}"。net/http 套件也支援這種動態路由的設定,讓我在原本的程式中增加一些 user 的資料,如下:


func userHandler(w http.ResponseWriter, r *http.Request) {
	username := r.URL.Query().Get("username")
	fmt.Fprintf(w, "Welcome, %s!", username)
}

func main() {
	mux := http.NewServeMux()

	// 設定動態路由
	mux.HandleFunc("/user", userHandler)

	// 啟動 HTTP 伺服器
	http.ListenAndServe(":8080", mux)
}

我在原本的程式中增加了一個 userhandler,並且在 main() 增加一個處理 /user 的路由,go build 完這支程式碼並執行後,我們到瀏覽器輸入 http://127.0.0.1:8080/user,此時,瀏覽器便會出現 Welcome, !,如下:
no user 頁面
你會覺得哪裡怪怪的,username 跑去哪了,這是因為使用者的名稱是通過 URL 參數傳遞的。所以當訪問 "/user?username=John" 時,將會顯示 "Welcome, John!"。
username

Go 的 net/http 提供了一個簡單而有效的路由機制,能夠滿足大多數 Web 開發的需求。這使得應用程式的結構清晰,易於擴展。隨著 URL 越來越複雜,我們也可以將其彙整到一個專門處理路由的資料夾。

另外,在正常情況下,我們不會透過 URL.Query 的方式去手動輸入使用者名稱去取得相關資料,而這些資料是被存在哪裡呢?所以明天我將介紹該如何去儲存使用者資料。


上一篇
[ Day 23 ] Go 模板引擎:動態生成 HTML 頁面的魔法
下一篇
[ Day 25 ] Go 資料庫:建立和管理資料庫連接的指南
系列文
起步Go!Let's Go!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言