iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
1

今日目標

今天的目標非常簡單,我們要自己寫一個非常陽春的 http server 監聽在 port 8080,話不多說,直接開始吧!

net/http

net 是 Go 裡面專門處理網路相關的 package,而底下的 net/http 則負責處理 http,因為我們要寫的是 http server 所以在這邊會大量使用到他

Request Handler

// main.go
import "net/http"

func handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello World"))
}

為了處理請求我們要先寫好一個 request handler,在 Go 中 handler 通常會接受兩個參數 wr

  • http.ResponseWriter

    w 是一個 http.ResponseWriter,看他的型別就知道他主要負責把資料回覆給瀏覽器,其中最常用的 method 是 w.Write([]byte),用來傳輸 []byte 格式的資料,如果你寫過 Node.js 的話那就相當於 Express 的 res.send()

  • http.Request

    r 的型別是 *http.Request,相當於 Express 中的 req 物件,裡面包含這個請求的 http method、header、body 等等,需要的時候就可以拿出來用,比較常用的有 r.Bodyr.Header 取得請求的 body 跟 header

上面那個 handler 做的事情很簡單,就只是回覆 Hello World 給 Http Client,因為 res.Write() 只接受 byte array,所以要先把 Hello World 轉型成 []byte 再送出,這樣瀏覽器就會收到 Hello World

監聽 port

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

整個程式的起點 main() 先用 http.HandleFunc("/", handler) 指派剛寫好的 handler function 負責處理所有請求,包刮各種 method 像是 GET、POST 等等

接下來就是使用 http.ListenAndServe 監聽在 port 8080,這樣就完成了一個最基本的 http server,用終端機跑 go run main.go 之後就可以在 http://localhost:8080 看到 Hello World,很簡單吧~

錯誤處理

func main() {
    http.HandleFunc("/", handler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        panic(err)
    }
}

有時在監聽的過程中可能會發生一些錯誤,譬如說 port 已經被佔用或是其他問題,這時候就可以檢查 http.ListenAndServe 回傳的錯誤是不是空的(nil),如果有錯誤就 panic 然後終止程式,類似其他語言的 throw error

小結

今天用內建的 net/http 自己寫了一個非常陽春的 http server,程式碼都放在 Github 上,可以 clone 下來然後 checkout 到 5cbf8f3 跑跑看

跟前幾天一樣,有什麼問題或看不懂的地方都很歡迎大家在下面留言,我會盡量回覆大家~


上一篇
Day07-Go 語法 III
下一篇
Day09-基本功能:轉發請求
系列文
Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言