Go語言標准庫內建提供了net/http包,涵蓋了HTTP客戶端和服務端的具體實現。使用net/http包,我們可以很方便地編寫HTTP客戶端或服務端的程序。
http服務端的創建流程
在使用http/net包創建服務端只需要兩個步驟 綁定處理器函數 func(ResponseWriter, *Request)
與 啟用監聽 http.ListenAndServe
。
package main
import "net/http"
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("123"))
})
http.ListenAndServe(":8080", nil)
}
通過分析net/http
包中server.go
在執行創建http服務端主要執行了下面幾個步驟:
http.HandleFunc
綁定處理函數- 所有的操作的方法都屬於一個結構體
ServeMux
- m: 用戶傳入的路由和處理方法的映射表,路由和處理函數被定義為結構體
muxEntry
的屬性 - mu: 實例化出來的對象的讀寫鎖
- m: 用戶傳入的路由和處理方法的映射表,路由和處理函數被定義為結構體
- 調用
DefaultServeMux.Handle()
- 在
DefaultServeMux.Handle()
中調用DefaultServeMux.HandleFunc(pattern, handler)
- 在將傳入http.HandleFunc()的回調函數,與路由的映射信息,放到該
DefaultServeMux
的屬性中 映射map中muxEntry
http.ListenAndServe
啟動服務監聽- 實例化一個server結構體
- 調用
ListenAndServe()
ListenAndServe()
中net.Listen("tcp", addr)
啟動tcp服務監聽- Serve()中 appcet()處理用戶連接,
go c.serve(connCtx)
處理業務段(如判斷信息,拼接http、找到對應處理函數)
綜上所述,net/http server.go
一切的基礎為ServeMux 和 Handler
Go語言的net/http
包還封裝了常用處理器,如 FileServer
,NotFoundHandler
RedirectHandler
http客戶端的使用
package main
import (
"bytes"
"fmt"
"net/http"
"reflect"
)
func main() {
resp, err := http.Get("http://www.baidu.com")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(reflect.TypeOf(resp.Body)) // *http.gzipReader
b := bytes.NewBuffer(make([]byte, 1024))
b.ReadFrom(resp.Body)
fmt.Println(string(b.Bytes()))
}
post請求
package main
import (
"net/http"
"fmt"
"io/ioutil"
"net/url"
)
func main() {
postParam := url.Values{
"user": {"xxxxxx"},
"Pwd": {"1"},
}
resp, err := http.PostForm("http://www.baidu.com/loginRegister/login", postParam)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}