日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

圖文講透Golang標(biāo)準(zhǔn)庫 net/http實(shí)現(xiàn)原理 - 客戶端

來源: 責(zé)編: 時(shí)間:2024-02-05 09:31:07 205觀看
導(dǎo)讀客戶端的內(nèi)容將是如何發(fā)送請(qǐng)求和接收響應(yīng),走完客戶端就把整個(gè)流程就完整的串聯(lián)起來了!這次我把調(diào)用的核心方法和流程走讀的函數(shù)也貼出來,這樣看應(yīng)該更有邏輯感,重要部分用紅色標(biāo)記了一下,可以著重看下。圖片先了解下核心數(shù)

客戶端的內(nèi)容將是如何發(fā)送請(qǐng)求和接收響應(yīng),走完客戶端就把整個(gè)流程就完整的串聯(lián)起來了!jlM28資訊網(wǎng)——每日最新資訊28at.com

這次我把調(diào)用的核心方法和流程走讀的函數(shù)也貼出來,這樣看應(yīng)該更有邏輯感,重要部分用紅色標(biāo)記了一下,可以著重看下。jlM28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jlM28資訊網(wǎng)——每日最新資訊28at.com

先了解下核心數(shù)據(jù)結(jié)構(gòu)Client和Request。jlM28資訊網(wǎng)——每日最新資訊28at.com

Client結(jié)構(gòu)體

type Client struct {     Transport RoundTripper     CheckRedirect func(req *Request, via []*Request) error     Jar CookieJar     Timeout time.Duration}

四個(gè)字段分別是:jlM28資訊網(wǎng)——每日最新資訊28at.com

  • ? Transport:表示 HTTP 事務(wù),用于處理客戶端的請(qǐng)求連接并等待服務(wù)端的響應(yīng);
  • ? CheckRedirect:處理重定向的策略
  • ? Jar:管理和存儲(chǔ)請(qǐng)求中的 cookie
  • ? Timeout:超時(shí)設(shè)置

Request結(jié)構(gòu)體

Request字段較多,這里就列舉一下常見的一些字段jlM28資訊網(wǎng)——每日最新資訊28at.com

type Request struct {    Method string    URL *url.URL    Header Header    Body io.ReadCloser    Host string    Response *Response    ...}
  • ? Method:指定的HTTP方法(GET、POST、PUT等)
  • ? URL:請(qǐng)求路徑
  • ? Header:請(qǐng)求頭
  • ? Body:請(qǐng)求體
  • ? Host:服務(wù)器主機(jī)
  • ? Response:響應(yīng)參數(shù)

構(gòu)造請(qǐng)求

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 方法。jlM28資訊網(wǎng)——每日最新資訊28at.com

DefaultClient 是 Client 的一個(gè)空實(shí)例(跟DefaultServeMux有點(diǎn)子相似)jlM28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jlM28資訊網(wǎng)——每日最新資訊28at.com

Client.GetjlM28資訊網(wǎng)——每日最新資訊28at.com

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)求。jlM28資訊網(wǎng)——每日最新資訊28at.com

NewRequestWithContextjlM28資訊網(wǎng)——每日最新資訊28at.com

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。jlM28資訊網(wǎng)——每日最新資訊28at.com

準(zhǔn)備發(fā)送請(qǐng)求

構(gòu)造好的Request結(jié)構(gòu)req,會(huì)傳入c.Do()方法。jlM28資訊網(wǎng)——每日最新資訊28at.com

我們看下發(fā)送請(qǐng)求過程調(diào)用了哪些方法,用下圖表示下jlM28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jlM28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接: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

上一篇: Python協(xié)程的實(shí)現(xiàn)方式

下一篇: NextTick 在 Vue 中如何發(fā)揮作用的?其實(shí)大部分人一知半解

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 海城市| 黔南| 万全县| 如皋市| 青川县| 静海县| 井陉县| 承德市| 简阳市| 瑞昌市| 日土县| 会昌县| 旬阳县| 祁门县| 四川省| 龙井市| 边坝县| 滦南县| 永泰县| 罗山县| 沈丘县| 香格里拉县| 佛冈县| 通海县| 西乌| 霍邱县| 六安市| 嘉荫县| 汝城县| 丹江口市| 耒阳市| 京山县| 土默特左旗| 新建县| 札达县| 延吉市| 武鸣县| 永靖县| 逊克县| 铜鼓县| 时尚|