想要使用 Golang 來架設網站也非常的方便
我們只需要使用到 net/http 與 io 包就可以達成一個 web app 的實現
package main
import (
"net/http"
"io"
"fmt"
)
func main() {
//註冊路由&回傳方法
http.HandleFunc("/", helloWorld)
http.HandleFunc("/hi",hi)
//監聽位置 假設監聽本機位置直接 :port 號
//指定 ip 位置 ex. 162.168.10.2:8080
//第二參數為 serverMux nil == defaultServerMux
http.ListenAndServe(":8080", nil)
}
//路由的回傳方法
func helloWorld(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world")
}
func hi(w http.ResponseWriter, r *http.Request){
fmt.Fprint(w,"hi golang web app")
}
上方程式碼非常簡單短短幾行就可以做出一個 hello world web app
首先使用 http 包中的 HandleFunc() 方法來進行路由的註冊與設定回傳的方法
最後在使用 ListenAndServer() 來監聽 ip 與 port 位置
回傳方法可以點進去 http.HandleFunc() 中查看需要什麼參數
// HandleFunc registers the handler function for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
可以看到第一個參數 pattern 也就是路由規則第二個參數為 func(ResponseWriter,*Request)
所以我們自定一個 func helloWorld(w http.ResponseWriter, r *http.Request) 方法進行傳入
然後在我們回傳中的 func 中使用 io.writeString(Writer,string) 把文字輸出到網頁中
也可以利用 fmt.Fprint 相關函數進行文字的輸出
執行結果如下
127.0.0.1:8080
127.0.0.1:8080/hi
可以發現它會經由我們設定的 HandleFunc 做相對應的回傳訊息
我們在深入的去解析 http 包到底是如何運作的
在最後的程式碼中我們使用了 http.ListenAndServer(":8080",nil)
第二個參數傳入nil 使用 default value
如果我們要字定義 serverMux 呢?
package main
import (
"net/http"
"io"
"fmt"
)
type webHandler struct {
}
func (h *webHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "ServerMux Handler")
}
func main() {
//自訂義 serverHandler
mux := http.NewServeMux()
//註冊路由&回傳方法
mux.Handle("/", &webHandler{})
mux.HandleFunc("/hello", helloWorld)
mux.HandleFunc("/hi", hi)
//監聽位置
http.ListenAndServe(":8080", mux)
}
//路由的回傳方法
func helloWorld(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world")
}
func hi(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hi golang web app")
}
我們查看 http 包裡的 Handler 可以看到以下資訊
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
所以我們建立了一個 type wevHandler struct並且實現了 ServerHTTP() 方法
然後就跟我們第一次使用方法雷同
進行 handler 註冊使瀏覽器可以顯示相對應資訊
127.0.0.1:8080
127.0.0.1:8080/hello
127.0.0.1:8080/hi
如果想要自己自訂http.ListenAndServe() 呢?
程式碼如下
package main
import (
"net/http"
"io"
"fmt"
"time"
)
type webHandler struct {
}
func (h *webHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if handler,ok:= muxMap[r.URL.String()];ok{
handler(w,r)
return
}
fmt.Fprintf(w, "ServerMux Handler URL = %s ",r.URL.String())
}
var muxMap map[string]func(w http.ResponseWriter,r *http.Request)
func main() {
//註冊路由&回傳方法
muxMap = make( map[string]func(w http.ResponseWriter,r *http.Request))
muxMap["/hello"]=helloWorld
muxMap["/hi"]=hi
// create http Server struct
server:=http.Server{
Addr:":8080",//ip addr
Handler:&webHandler{},//server mux
ReadHeaderTimeout:10*time.Second,//set timeout
}
//監聽位置
server.ListenAndServe()
}
//路由的回傳方法
func helloWorld(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world")
}
func hi(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hi golang web app")
}
我們一樣保持一個自訂義的 Handler struct
建立一個 map[string]func(w http.ResponseWriter,r *http.Request) 的 map
也創建一個 Server 的 struct
並且設定 Addr , Handler , ReadTimeout
然後把路由規則加入創建的 map 中並且在 webHandler 的 ServerHTTP 方法中實現路由規則
最後在使用 server.ListenAndServe() 方法來啟動 web app
效果如下
127.0.0.1:8080
127.0.0.1:8080/hello
127.0.0.1:8080/hi
127.0.0.1:8080/hello/5656
程式碼 : GitHub
0 意見:
張貼留言