iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
Modern Web

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

[ Day 21 ] Go HTTP 伺服器:啟航你的網路冒險之旅

  • 分享至 

  • xImage
  •  

經過先前的單元,你應該更了解 Go 了吧!
再次提一下,Go 以其簡潔、高效、並發支持而聞名,不僅在系統程式設計領域表現出色,同時也廣泛應用在網路應用程式的開發。接下來,將介紹如何用 Go 建立你的第一個 HTTP 伺服器。我會從基本的例子開始,讓我們進入 Go Web 開發的精彩世界。
但在開始進入正題前,先看以下程式碼:

package main

import (
	"fmt"
	"net/http"
)

func sayHello(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, Go Server!")
}

func main() {
	http.HandleFunc("/", sayHello)
	http.ListenAndServe(":8080", nil)
}

使用 go build go_web.go 並開啟這個檔案;隨後,我們打開瀏覽器,並輸入 http://127.0.0.1:8080/,會看到這個畫面:

當你看到這個畫面,那恭喜你,你已經成功地啟動你的第一支 Go Web 程式了。

剛剛發生了什麼事?

我們回頭來看一下,剛剛那段程式到底做了什麼事吧!

1. 匯入 net/http 套件

這個套件,是組成 Web 服務中不可或缺的套件,它提供了實現網路和 HTTP 服務的功能。

import (
    "fmt"
    "net/http"
)

2. 定義處理函示

在這邊定義了一個自製的 sayHello 的函式。其中,這個函式接收了兩個參數,一個是 http.ResponseWriter,另一個是 http.Request

func sayHello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, Go Server!")
}

http.ResponseWriter

為 Go 的一個介面 (interface),它定義了寫入 Http Response 的方法。當 Go 處理 Http 請求時,需要向客戶端發送一些數據,而這一個步驟就是透過 http.ResponseWriter 來完成的。
此外,當我們在 VS code 按住 command 滑鼠同時點擊 ResponseWriter,此時,會進到了一個名為 server.go 的檔案,並跳到 ResponseWriterinterface

type ResponseWriter interface {
    Header() Header
    Write([]byte) (int, error)
    WriteHeader(statusCode int)
}

這個接口定義了三個方法:

  1. Header(): 用於設置 Http Response 的標頭。
  2. Write([]byte) (int, error): 用於將字節數組寫入 HTTP Response 主體,並返回寫入字節數及可能的錯誤。
  3. WriteHeader(statusCode int): 用於設置 HTTP Response status codes
    剛剛例子中的 fmt.Fprintf(w, "Hello, Go Server!"),這個會將 Hello, Go Server 字串格式化後寫入到 HTTP Response 的主體。
    所以我們才會在網站上就可以看到返回的內容。

http.Request

為 Go 的結構體,代表一個 HTTP Request 的資訊,當客戶端向伺服器發送 HTTP 請求時,伺服器端會創建一個 http.Request 實例,其中包含了這個請求的所有相關資訊。
這個結構體 (Struct) 包含了很多有用的訊息,例如:

  1. Method(方法): 該請求使用的 HTTP 方法,例如 GET、POST 等。
  2. URL(統一資源定位符): 被請求的 URL,包括路徑、查詢參數等。
  3. Header(標頭): 請求的標頭信息,包括 Content-Type、User-Agent 等。
  4. Body(主體): 請求的主體,通常是 POST 或 PUT 請求中的資料。
  5. RemoteAddr(遠端地址): 發送請求的客戶端的網路位址。
    簡單來說,當有人在瀏覽器輸入一個網址,然後按下 Enter 鍵時,這個動作就是一個 HTTP 請求。

3. 主函式 main

現在,我們來看主函式:

func main() {
	http.HandleFunc("/", sayHello)
	http.ListenAndServe(":8080", nil)
}

這個主要去啟動一個簡單的 HTTP 伺服器,並且設定了一個函式來處理跟路徑的 HTTP 請求。

http.Handlefunc("/", sayHello)

這個是用來設定一個處理 / 這個根路徑的函式,當有請求時,會呼叫這個函式。而 sayHello 這個函式就是剛剛上面解釋的處理 HTTP response 及 Request 的處理函式。
當在瀏覽器上輸入 http://127.0.0.1:8080/,也就是這個網站的根路徑,此時,就會觸發這個路由。
簡單來說,這個程式碼會告訴伺服器,當有人訪問根路徑 (\) 時,會呼叫 sayHello 函式來處理這個請求。

http.ListenAndServe(":8080", nil)

這個的作用就是啟動一個 HTTP 伺服器,並且指定伺服器的地址和處理請求的多路徑鍵 (Mux)。
:8080 : 表示伺服器在本地的 8080 埠口 (port) 上運行。可以根據你的需要更改埠口號。
nil : 這表示使用預設的多路徑鍵 (Mux)。舉例來說:

func about(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "About Us Page")
}

func main() {
	http.HandleFunc("/", sayHello)
	http.HandleFunc("/about", about)
	http.ListenAndServe(":8080", nil)
}

當使用者進到 http://127.0.0.1:8080/about 時,就可以看到 "About Us Page" 的字樣。這就是多路徑鍵的作用,使開發者可以針對不同的路徑定義不同的邏輯。

今天,成功地建立了一個簡單的 Go HTTP 伺服器,這也是你進入 Go Web 開發的第一步。我們學習了如何匯入 net/http 套件,定義處理函式,以及如何使用 http.HandleFunc 和 http.ListenAndServe 來啟動伺服器。
那們我們明天見!!


上一篇
[ Day 20 ] Go 反射:程式碼的魔法鏡
下一篇
[ Day 22 ] GO 創建簡單的用戶端:踏上與伺服器對話的征途
系列文
起步Go!Let's Go!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言