Parsen des HTTP-Clients von Go

藏色散人
Freigeben: 2021-05-10 21:56:23
nach vorne
4873 Leute haben es durchsucht

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)
Nach dem Login kopieren
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)
Nach dem Login kopieren

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
Nach dem Login kopieren

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) }
Nach dem Login kopieren
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}
Nach dem Login kopieren

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}
Nach dem Login kopieren
E

5.3 zum Initiieren des Dials -
func (t *Transport) queueForDial(w *wantConn) {
    go t.dialConnFor(w)}
Nach dem Login kopieren
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)}
Nach dem Login kopieren
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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage