客戶端的內(nèi)容將是如何發(fā)送請(qǐng)求和接收響應(yīng),走完客戶端就把整個(gè)流程就完整的串聯(lián)起來了!
這次我把調(diào)用的核心方法和流程走讀的函數(shù)也貼出來,這樣看應(yīng)該更有邏輯感,重要部分用紅色標(biāo)記了一下,可以著重看下。
圖片
先了解下核心數(shù)據(jù)結(jié)構(gòu)Client和Request。
type Client struct { Transport RoundTripper CheckRedirect func(req *Request, via []*Request) error Jar CookieJar Timeout time.Duration}
四個(gè)字段分別是:
Request字段較多,這里就列舉一下常見的一些字段
type Request struct { Method string URL *url.URL Header Header Body io.ReadCloser Host string Response *Response ...}
var DefaultClient = &Client{}func Get(url string) (resp *Response, err error) { return DefaultClient.Get(url)}
示例HTTP 的 Get方法會(huì)調(diào)用到 DefaultClient 的 Get 方法,,然后調(diào)用到 Client 的 Get 方法。
DefaultClient 是 Client 的一個(gè)空實(shí)例(跟DefaultServeMux有點(diǎn)子相似)
圖片
Client.Get
func (c *Client) Get(url string) (resp *Response, err error) { req, err := NewRequest("GET", url, nil) if err != nil { return nil, err } return c.Do(req)}func NewRequest(method, url string, body io.Reader) (*Request, error) { return NewRequestWithContext(context.Background(), method, url, body)}
Client.Get() 根據(jù)用戶的入?yún)ⅲ?qǐng)求參數(shù) NewRequest使用上下文包裝NewRequestWithContext ,接著通過 Client.Do 方法,處理這個(gè)請(qǐng)求。
NewRequestWithContext
func NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error) { ... // 解析url u, err := urlpkg.Parse(url) ... rc, ok := body.(io.ReadCloser) if !ok && body != nil { rc = ioutil.NopCloser(body) } u.Host = removeEmptyPort(u.Host) req := &Request{ ctx: ctx, Method: method, URL: u, Proto: "HTTP/1.1", ProtoMajor: 1, ProtoMinor: 1, Header: make(Header), Body: rc, Host: u.Host, } ... return req, nil}
NewRequestWithContext 函數(shù)主要是功能是將請(qǐng)求封裝成一個(gè) Request 結(jié)構(gòu)體并返回,這個(gè)結(jié)構(gòu)體的名稱是req。
構(gòu)造好的Request結(jié)構(gòu)req,會(huì)傳入c.Do()方法。
我們看下發(fā)送請(qǐng)求過程調(diào)用了哪些方法,用下圖表示下
圖片
本文鏈接:http://www.www897cc.com/showinfo-26-73789-0.html圖文講透Golang標(biāo)準(zhǔn)庫 net/http實(shí)現(xiàn)原理 - 客戶端
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com