Golang http之client源码详解

http客户端介绍

         http 是典型的 C/S 架构,客户端向服务端发送请求(request),服务端做出应答(response)。本文章主要介绍Golanghttp客户端的相关源码,源码主要在net/http/client.go中。源码版本号为1.10.3

一个简单的http 客户端请求例子:

package main
import (
	"log"
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {
	resp,err := http.Get("http://www.baidu.com")
	if err != nil {
		log.Fatal(err)
	}

	d,err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}
	resp.Body.Close()

	fmt.Println(string(d))
}

        http客户端直接调用http包的Get获取相关请求数据。如果客户端在请求时需要设置header,则需要使用NewRequest和 DefaultClient.Do。我们看一下设置Header的操作例子

package main

import (
	"fmt"
	"net/http"
	"log"
	"io/ioutil"
)

func main() {
	req,err := http.NewRequest("GET","http://www.baidu.com",nil)
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("key","value")
	resp ,err :=  http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}

	byts,err := ioutil.ReadAll(resp.Body)
	defer resp.Body.Close()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(byts))
}

      

源码分析

     Client结构体

 type Client struct {
	
	Transport RoundTripper

	CheckRedirect func(req *Request, via []*Request) error

	
	Jar CookieJar

	
	Timeout time.Duration
}

我们看到Client的结构体非常简单,只有几个字段。Client表示一个HTTP客户端,它的默认值是DefaultClient会默认使用DefaultTransport的可用客户端。

Transport表示HTTP事务,用于处理客户端的请求并等待服务端的响应

CheckRedirect 用于指定处理重定向的策略

Jar指定cookie的jar

Timeout 指定客户端请求的最大超时时间,该超时时间包括连接,任何的重定向以及读取响

应体的时间。如果服务器已经返回响应信息该计时器仍然运行,并将终端Response.Body的读取。如果Timeout为0则意味着没有超时

RoundTripper接口

type RoundTripper interface {
	RoundTrip(*Request) (*Response, error)
}

  RoundTripper表示执行单个HTTP事务的接口,必须是并发安全的。它的相关源码我们在前面已经介绍过了,可以参考以下地址

https://blog.csdn.net/skh2015java/article/details/89340215

 

我们通过一些常用的http包对外提供的方法来窥探http客户端的请求流程和机制。

Get方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值