Go语言实现httpServer

2021/06/19

Tags: Go

摘要:使用Go语言原生包实现Http Server。


启动一个Http Server

使用Go语言原生的net/http库可以很简单实现一个http server。

log.Println("start server")
if err := http.ListenAndServe(":8080", nil); err != nil {
    log.Println("start server on 8080")
}
log.Fatal("start server failed.")

没错,只要这么几行代码,就开启了一个http server,监听8080端口。

接收Http请求

http.HandleFunc

开启了Http server后,无法处理Http请求这个就是个空的Server,下面给它加上处理Http Request的能力。

func init() {
    log.Println("start server")
    http.HandleFunc("/hello_world", HelloWorld)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Println("start server on 8080")
    }
    log.Fatal("start server failed.")
}

func HelloWorld(w http.ResponseWriter, r *http.Request) {
    _, err := w.Write([]byte("hello world"))
    if err != nil {
        log.Println(err)
    }
}

http.HandleFunc("/hello_world", HelloWorld) 这行代码指定了一个路由对应的方法,然后访问http://127.0.0.1:8080/hello_world 可以得到hello world的字符串,这段字符串也是HelloWorld(w http.ResponseWriter, r *http.Request) 函数的输出。

http.Handle

func init() {
    log.Println("start server")
    http.HandleFunc("/hello_world", HelloWorld)
    http.Handle("/test_handle", &TestHandleStruct{content: "test handle"})
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Println("start server on 8080")
    }
    log.Fatal("start server failed.")
}

type TestHandleStruct struct {
    content string
}

// 实现 Handler interface
func (handle *TestHandleStruct) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    _, err := fmt.Fprintf(w, handle.content)
    if err != nil {
        log.Fatal("response failed")
    }
}

还有一种方式可以实现处理http request,就是实现Handle接口,实现接口需要借助TestHandleStruct结构体去实现,定义结构体的方法实现接口方法ServeHTTP(w http.ResponseWriter, r *http.Request)

然后访问http://127.0.0.1:8080/test_handle 就可以得到test handle字符串。

其实这两种实现方式底层都是一样的:

// Handle registers the handler for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

// 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)
}