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)文章
GoFrame通用類型變量gvar與interface基本使用對比
這篇文章主要為大家介紹了GoFrame通用類型變量gvar與interface基本使用對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06VsCode搭建Go語言開發(fā)環(huán)境的配置教程
這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05CentOS 32 bit安裝golang 1.7的步驟詳解
Go是Google開發(fā)的一種編譯型,并發(fā)型,并具有垃圾回收功能的編程語言。在發(fā)布了6個rc版本之后,Go 1.7終于正式發(fā)布了。本文主要介紹了在CentOS 32 bit安裝golang 1.7的步驟,文中給出了詳細的步驟,相信對大家的學習和理解具有一定的參考借鑒價值,下面來一起看看吧。2016-12-12go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染
這篇文章主要為大家介紹了go開源Hugo站點構(gòu)建三步曲之集結(jié)渲染詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02