Heim >Backend-Entwicklung >Golang >Parsen des HTTP-Clients von Go

Parsen des HTTP-Clients von Go

藏色散人
藏色散人nach vorne
2021-05-10 11:37:124894Durchsuche

Die folgende Tutorial-Kolumne von golang stellt Ihnen den http-Client von Go vor. Ich hoffe, dass es für Freunde hilfreich ist, die es brauchen!

Dr.

resp, err := http.Get("https://baidu.com") if err != nil {
    fmt.Printf("发起请求失败:%v", err)
    return }defer resp.Body.Close() io.Copy(os.Stdout, resp.Body)
Der allgemeine Prozess der Anfrage

1. Erstellen Sie das Anfrageobjekt gemäß den Anfragebedingungen

2. Alle Clientanfragen werden von client.do() verarbeitet
func (c *Client) do(req *Request) (retres *Response, reterr error)

2.1 Anfrageanfrage Verwendet client.send()-Verarbeitung

3.send-Funktion
func (c *Client) send(req *Request, deadline time.Time) (resp *Response, didTimeout func() bool, err error)resp, didTimeout, err = send(req, c.transport(), deadline)//默认传DefaultTransport

4.Die RoundTrip-Methode von DefaultTransport ist eigentlich die RoundTrip-Methode von Transport

5. Verwenden Sie die Verbindungspool-Technologie, um das Verbindungsobjekt *persistConn

zu erhalten
func send(ireq *Request, rt RoundTripper, deadline time.Time) (resp *Response, didTimeout func() bool, err error) {
    resp, err = rt.RoundTrip(req) }
S 5.1 Transport.queueFordial hat die Verbindung initiiert
func (t *Transport) roundTrip(req *Request) (*Response, error) {
    treq := &transportRequest{Request: req, trace: trace} //封装新的request
    cm, err := t.connectMethodForRequest(treq)
    pconn, err := t.getConn(treq, cm) //使用连接池技术,获取连接对象*persistConn,
    resp, err = pconn.roundTrip(treq) //使用连接对象获取response}

5.2 zum Initiieren des DialConnFor R
func (t *Transport) getConn(treq *transportRequest, cm connectMethod) (pc *persistConn, err error) {
    w := &wantConn{ //构建连接对象
        cm:         cm,
        key:        cm.key(),
        ctx:        ctx,
        ready:      make(chan struct{}, 1),
        beforeDial: testHookPrePendingDial,
        afterDial:  testHookPostPendingDial,
    }
    if delivered := t.queueForIdleConn(w); delivered {//从连接池获取符合的连接对象,有就返回
        pc := w.pc        
        return pc, nil
    }    
    t.queueForDial(w)//发起连接

    select {
    case <-w.ready:    //连接准备好,就返回连接对象    
        return w.pc, w.err}
E

5.3 zum Initiieren des Dials -
func (t *Transport) queueForDial(w *wantConn) {
    go t.dialConnFor(w)}
5.4 Wenn es nach dem Ende nicht geschlossen wird, wird es dazu führen die Coroutine zum Offenlegen
func (t *Transport) dialConnFor(w *wantConn) {
    pc, err := t.dialConn(w.ctx, w.cm) //发起拨号,返回连接对象
    delivered := w.tryDeliver(pc, err)}
E
5.4.1 PC.ReadResponse, um die Antwort zu erhalten
5.4.2 ReadResponse
6. Verwenden Sie das Verbindungsobjekt *persistConn, um die Antwort zu erhalten

Das obige ist der detaillierte Inhalt vonParsen des HTTP-Clients von Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen