客戶端的內(nèi)容將是如何發(fā)送請求和接收響應(yīng),走完客戶端就把整個流程就完整的串聯(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}四個字段分別是:
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方法會調(diào)用到 DefaultClient 的 Get 方法,,然后調(diào)用到 Client 的 Get 方法。
DefaultClient 是 Client 的一個空實例(跟DefaultServeMux有點子相似)
圖片
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)ⅲ埱髤?shù) NewRequest使用上下文包裝NewRequestWithContext ,接著通過 Client.Do 方法,處理這個請求。
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ù)主要是功能是將請求封裝成一個 Request 結(jié)構(gòu)體并返回,這個結(jié)構(gòu)體的名稱是req。
構(gòu)造好的Request結(jié)構(gòu)req,會傳入c.Do()方法。
我們看下發(fā)送請求過程調(diào)用了哪些方法,用下圖表示下
圖片
本文鏈接:http://m.www897cc.com/showinfo-26-73789-0.html圖文講透Golang標(biāo)準(zhǔn)庫 net/http實現(xiàn)原理 - 客戶端
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com