Now you can Subscribe using RSS

Submit your Email

2017/10/24

Golang http 使用

asd
Golang 中的 http 包非常的完善
想要使用 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 意見:

張貼留言

Coprights @ 2016, Blogger Templates Designed By Templateism | Templatelib