Go net/http的簡(jiǎn)單使用小結(jié)
Go語言提供了一個(gè)功能豐富的net/http包,它提供了客戶端和服務(wù)端的實(shí)現(xiàn),使得我們可以比較輕易的創(chuàng)建http服務(wù)。
創(chuàng)建一個(gè)簡(jiǎn)單的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)建并運(yùn)行HTTP server
server := http.Server{Addr: ":8080", Handler: mux}
log.Fatal(server.ListenAndServe())
除了上面我們使用http.NewServeMux創(chuàng)建一個(gè)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其實(shí)也是調(diào)用了ServeMux的HandleFunc方法,只是使用了DefaultServeMux這個(gè)默認(rèn)實(shí)例的用法,這種使用方式在其他庫(kù)也是常見的一種方式
Client
Client類型代表HTTP客戶端。它的零值(DefaultClient)是一個(gè)可用的使用DefaultTransport的客戶端,這里其實(shí)跟DefaultServeMux一樣的實(shí)現(xiàn)方。
我們也可以自己實(shí)例化一個(gè)client
client := &http.Client{
//指定處理重定向的策略
CheckRedirect: redirectPolicyFunc,
//指定本類型的值執(zhí)行請(qǐng)求的時(shí)間限制
Timeout:30,
}
//發(fā)送Get請(qǐng)求
resp, err := client.Get("http://example.com")
不過不管是使用默認(rèn)還是自己實(shí)例化client,底層都是調(diào)用do方法,然后基于do方法做Get/Post/PostForm的上層封裝。PostForm的話是提交表單,url.Values類型的data會(huì)被編碼為請(qǐng)求的主體。Post數(shù)據(jù)的類型一般會(huì)設(shè)為"application/x-www-form-urlencoded"。
resp, err := http.PostForm("http://example.com/form",
url.Values{"key": {"Value"}, "id": {"123"}})
//實(shí)際調(diào)用方法,Get/Post都是基于do方法做的封裝
func (c *Client) do(req *Request) (retres *Response, reterr error) {
上層對(duì)do方法的封裝主要體現(xiàn)在對(duì)Request結(jié)構(gòu)傳遞的不同,比如設(shè)置Request的Method(請(qǐng)求方式Get、Post),具體的Request結(jié)構(gòu)體的可以在net/http/client.go看到。
Request結(jié)構(gòu)
Request類型代表一個(gè)服務(wù)端接受到的或者客戶端發(fā)送出去的HTTP請(qǐng)求,在Client發(fā)送請(qǐng)求是,也會(huì)傳遞一個(gè)request。
之前遇到一個(gè)怎么在request(請(qǐng)求)中可以使用下面方式獲取client使用PostForm發(fā)送請(qǐng)求參數(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(jià).MultipartForm字段得到結(jié)果中的第一個(gè)文件和它的信息 func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error)
Response結(jié)構(gòu)
Response代表一個(gè)HTTP請(qǐng)求的回復(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保管頭域的鍵值對(duì)。
Body io.ReadCloser // Body代表回復(fù)的主體。
ContentLength int64 // ContentLength記錄相關(guān)內(nèi)容的長(zhǎng)度。
TransferEncoding []string // 按從最外到最里的順序列出傳輸編碼
Close bool //Close記錄頭域是否指定應(yīng)在讀取完主體后關(guān)閉連接
Trailer Header //Trailer字段保存和頭域相同格式的trailer鍵值對(duì)
Request *Request // Request是用來獲取此回復(fù)的請(qǐng)求
TLS *tls.ConnectionState // TLS包含接收到該回復(fù)的TLS連接的信息
}
總結(jié)
net/http包我們?cè)谌粘i_發(fā)中長(zhǎng)會(huì)用到的一些使用大概描述了一下,比如怎么創(chuàng)建一個(gè)web服務(wù),發(fā)送請(qǐng)求調(diào)用do方法,request和response的結(jié)構(gòu)等。后面打算分享下自己對(duì)處理http請(qǐng)求流程的理解,哈哈,先拋出幾個(gè)問題:ServeHttp是什么,如果我們想實(shí)現(xiàn)自己的處理邏輯該怎么做,接口動(dòng)態(tài)轉(zhuǎn)發(fā)
到此這篇關(guān)于Go net/http的簡(jiǎn)單使用小結(jié)的文章就介紹到這了,更多相關(guān)Go net/http使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Go語言中net/http包的使用
- golang內(nèi)置net/http包的使用詳解
- go標(biāo)準(zhǔn)庫(kù)net/http服務(wù)端的實(shí)現(xiàn)示例
- 一文帶你吃透Golang中net/http標(biāo)準(zhǔn)庫(kù)服務(wù)端
- Go語言使用net/http實(shí)現(xiàn)簡(jiǎn)單登錄驗(yàn)證和文件上傳功能
- golang中的net/http庫(kù)基本使用詳解
- 一文詳解Golang中net/http包的實(shí)現(xiàn)原理
- Go 1.22對(duì)net/http包的路由增強(qiáng)功能詳解
- Go語言net/http庫(kù)使用詳解
相關(guān)文章
go使用支付寶沙箱實(shí)現(xiàn)支付寶支付的操作步驟
支付寶沙箱支付是支付寶提供的一個(gè)測(cè)試環(huán)境,用于開發(fā)者在不影響真實(shí)交易的情況下進(jìn)行支付接口的開發(fā)和調(diào)試,本文給大家介紹了go使用支付寶沙箱實(shí)現(xiàn)支付寶支付的操作步驟,文中有詳細(xì)的代碼示例和圖文供大家參考,需要的朋友可以參考下2024-03-03
golang中定時(shí)器cpu使用率高的現(xiàn)象詳析
這篇文章主要給大家介紹了關(guān)于golang中定時(shí)器cpu使用率高的現(xiàn)象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
golang實(shí)現(xiàn)文件上傳并轉(zhuǎn)存數(shù)據(jù)庫(kù)功能
這篇文章主要為大家詳細(xì)介紹了golang實(shí)現(xiàn)文件上傳并轉(zhuǎn)存數(shù)據(jù)庫(kù)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
Golang簡(jiǎn)介與基本語法的學(xué)習(xí)
這篇文章主要介紹了Golang簡(jiǎn)介與基本語法的學(xué)習(xí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04

