Go語言伺服器端處理HTTP、HTTPS請求

2020-07-16 10:05:17
本節我們主要來介紹一下使用Go語言編寫的 HTTP 伺服器端是如何處理 HTTP 和 HTTPS 請求的。

處理 HTTP 請求

使用 net/http 包提供的 http.ListenAndServe() 方法,可以對指定的地址進行監聽,開啟一個 HTTP,伺服器端該方法的原型如下:

func ListenAndServe(addr string, handler Handler) error

該方法用於在指定的 TCP 網路地址 addr 進行監聽,然後呼叫伺服器端處理程式來處理傳入的連線請求。

ListenAndServe 方法有兩個引數,其中第一個引數 addr 即監聽地址,第二個參數列示伺服器端處理程式,通常為空。第二個引數為空時,意味著伺服器端呼叫 http.DefaultServeMux 進行處理,而伺服器端編寫的業務邏輯處理程式 http.Handle() 或 http.HandleFunc() 預設注入 http.DefaultServeMux 中,程式碼如下所示:
http.Handle("/foo", fooHandler)
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080", nil))
如果想更多地控制伺服器端的行為,可以自定義 http.Server,程式碼如下所示:
s := &http.Server{
    Addr: ":8080",
    Handler: myHandler,
    ReadTimeout: 10 * time.Second,
    WriteTimeout: 10 * time.Second,
    MaxHeaderBytes: 1 << 20,
}
log.Fatal(s.ListenAndServe())
下面通過一個簡單的伺服器端範例來演示一下Go語言是如何處理 HTTP 請求的,程式碼如下所示:
package main

import (
    "io"
    "log"
    "net/http"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "C語言中文網n")
}
func main() {
    http.HandleFunc("/hello", HelloServer)
    err := http.ListenAndServe(":12345", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
成功執行上面的程式碼會佔用 12345 埠,我們可以使用瀏覽器存取http://localhost:12345/hello來檢視執行結果,如下所示: