前言
Go语言通过内置的标准库net/http
可以非常方便地实现web服务。不借助任何框架,单凭标准库,50行代码内即可实现简单的web服务。
http的ListenAndServe()
函数原型:
func ListenAndServe(addr string, handler Handler) error { server := &Server{Addr: addr, Handler: handler} return server.ListenAndServe() }
ListenAndServe()
函数用于在特定的TCP网络地址addr
上监听,然后调用服务端处理程序handler
来处理传入的接入请求。handler
通常为nil
,这意味着服务端调用默认的DefaultServeMux
。默认的DefaultServeMux
会自动注册用户定义的客户端逻辑处理程序。比如http.HandleFunc
示例代码:server.go
package main import ( "fmt" "net/http" ) func MyHandler(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { // 通过 r.URL.Query()获取客户端请求的Query参数 vars := r.URL.Query() // 获取Query键为key的参数值 key, ok := vars["key"] // 如果获取到,打印 hello get ... if ok { msg := "hello get " + key[0] // w.Write() 将数据返回给客户端 // 因为 msg 是字符串类型,因此需要强制进行类型转换 w.Write([]byte(msg)) } else { // 如果没获取到,则打印 hello world w.Write([]byte("hello world!")) } } if r.Method == "POST" { r.ParseForm() key := r.Form.Get("name") msg := "hello post " + key w.Write([]byte(msg)) } } func main() { // 路由请求处理函数 http.HandleFunc("/", MyHandler) // 在0.0.0.0:8000监听请求 // 第二个参数nil意味着服务端调用默认的DefaultServeMux处理客户端请求 err := http.ListenAndServe("0.0.0.0:8000", nil) if err != nil { fmt.Println(err) } }
示例代码:client.go
package main import ( "fmt" "io/ioutil" "net/http" "strings" ) func httpGet() { resp, err := http.Get("http://127.0.0.1:8000?key=python") if err != nil { fmt.Println(err) return } defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) } func httpPost() { resp, err := http.Post("http://127.0.0.1:8000", "application/x-www-form-urlencoded", strings.NewReader("name=Go")) if err != nil { fmt.Println(err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body)) } func main() { httpGet() httpPost() }
其它
- http/2:所有数据以二进制形式传输,支持多路复用、服务器推送和Header信息压缩
参考文档
- 汪明 - 《Go并发编程实战》清华大学出版社