Go net/http的簡單使用小結(jié)
Go語言提供了一個功能豐富的net/http包,它提供了客戶端和服務(wù)端的實現(xiàn),使得我們可以比較輕易的創(chuàng)建http服務(wù)。
創(chuàng)建一個簡單的http服務(wù)
//step1. 建立 URL:Handler映射表
servemux := http.NewServeMux()
servemux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, world")
})
//step2. 創(chuàng)建并運行HTTP server
server := http.Server{Addr: ":8080", Handler: mux}
log.Fatal(server.ListenAndServe())
除了上面我們使用http.NewServeMux創(chuàng)建一個mux然后再調(diào)用HandleFunc外我們可以也可以這樣使用
//直接調(diào)用http的Handle方法
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, world")
})
//Handle函數(shù)原型
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
DefaultServeMux.HandleFunc(pattern, handler)
}
// DefaultServeMux is the default ServeMux used by Serve.
var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux
HandleFunc其實也是調(diào)用了ServeMux的HandleFunc方法,只是使用了DefaultServeMux這個默認實例的用法,這種使用方式在其他庫也是常見的一種方式
Client
Client類型代表HTTP客戶端。它的零值(DefaultClient)是一個可用的使用DefaultTransport的客戶端,這里其實跟DefaultServeMux一樣的實現(xiàn)方。
我們也可以自己實例化一個client
client := &http.Client{
//指定處理重定向的策略
CheckRedirect: redirectPolicyFunc,
//指定本類型的值執(zhí)行請求的時間限制
Timeout:30,
}
//發(fā)送Get請求
resp, err := client.Get("http://example.com")
不過不管是使用默認還是自己實例化client,底層都是調(diào)用do方法,然后基于do方法做Get/Post/PostForm的上層封裝。PostForm的話是提交表單,url.Values類型的data會被編碼為請求的主體。Post數(shù)據(jù)的類型一般會設(shè)為"application/x-www-form-urlencoded"。
resp, err := http.PostForm("http://example.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
//實際調(diào)用方法,Get/Post都是基于do方法做的封裝
func (c *Client) do(req *Request) (retres *Response, reterr error) {
上層對do方法的封裝主要體現(xiàn)在對Request結(jié)構(gòu)傳遞的不同,比如設(shè)置Request的Method(請求方式Get、Post),具體的Request結(jié)構(gòu)體的可以在net/http/client.go看到。
Request結(jié)構(gòu)
Request類型代表一個服務(wù)端接受到的或者客戶端發(fā)送出去的HTTP請求,在Client發(fā)送請求是,也會傳遞一個request。
之前遇到一個怎么在request(請求)中可以使用下面方式獲取client使用PostForm發(fā)送請求參數(shù)的問題,可以用到下面這種方式。
//ParseForm解析URL中的查詢字符串,并將解析結(jié)果更新到r.Form字段,也就是 url.Values func (r *Request) ParseForm() error //接收經(jīng)過ParseForm的值 func (r *Request) FormValue(key string) string func (r *Request) PostFormValue(key string) string
文件上傳的話使用Fromfile
//FormFile返回以key為鍵查詢r.MultipartForm字段得到結(jié)果中的第一個文件和它的信息 func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error)
Response結(jié)構(gòu)
Response代表一個HTTP請求的回復(fù),該結(jié)構(gòu)主要有比如StatusCode狀態(tài)碼、Body回復(fù)主體等信息
type Response struct {
Status string // 例如"200 OK"
StatusCode int // 例如200
Proto string // 例如"HTTP/1.0"
ProtoMajor int // 例如1
ProtoMinor int // 例如0
Header Header // Header保管頭域的鍵值對。
Body io.ReadCloser // Body代表回復(fù)的主體。
ContentLength int64 // ContentLength記錄相關(guān)內(nèi)容的長度。
TransferEncoding []string // 按從最外到最里的順序列出傳輸編碼
Close bool //Close記錄頭域是否指定應(yīng)在讀取完主體后關(guān)閉連接
Trailer Header //Trailer字段保存和頭域相同格式的trailer鍵值對
Request *Request // Request是用來獲取此回復(fù)的請求
TLS *tls.ConnectionState // TLS包含接收到該回復(fù)的TLS連接的信息
}
總結(jié)
net/http包我們在日常開發(fā)中長會用到的一些使用大概描述了一下,比如怎么創(chuàng)建一個web服務(wù),發(fā)送請求調(diào)用do方法,request和response的結(jié)構(gòu)等。后面打算分享下自己對處理http請求流程的理解,哈哈,先拋出幾個問題:ServeHttp是什么,如果我們想實現(xiàn)自己的處理邏輯該怎么做,接口動態(tài)轉(zhuǎn)發(fā)
到此這篇關(guān)于Go net/http的簡單使用小結(jié)的文章就介紹到這了,更多相關(guān)Go net/http使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang實現(xiàn)文件上傳并轉(zhuǎn)存數(shù)據(jù)庫功能
這篇文章主要為大家詳細介紹了golang實現(xiàn)文件上傳并轉(zhuǎn)存數(shù)據(jù)庫功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07

