Heim >Backend-Entwicklung >Golang >Parsen des HTTP-Clients von Go
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
func (c *Client) do(req *Request) (retres *Response, reterr error)
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
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}
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
func (t *Transport) queueForDial(w *wantConn) { go t.dialConnFor(w)}
func (t *Transport) dialConnFor(w *wantConn) { pc, err := t.dialConn(w.ctx, w.cm) //发起拨号,返回连接对象 delivered := w.tryDeliver(pc, err)}E
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!