客戶端的內容將是如何發送請求和接收響應,走完客戶端就把整個流程就完整的串聯起來了!
這次我把調用的核心方法和流程走讀的函數也貼出來,這樣看應該更有邏輯感,重要部分用紅色標記了一下,可以著重看下。
圖片
先了解下核心數據結構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方法會調用到 DefaultClient 的 Get 方法,,然后調用到 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() 根據用戶的入參,請求參數 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 函數主要是功能是將請求封裝成一個 Request 結構體并返回,這個結構體的名稱是req。
構造好的Request結構req,會傳入c.Do()方法。
我們看下發送請求過程調用了哪些方法,用下圖表示下
圖片
本文鏈接:http://www.tebozhan.com/showinfo-26-73789-0.html圖文講透Golang標準庫 net/http實現原理 - 客戶端
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Python協程的實現方式