http客户端介绍
http 是典型的 C/S 架构,客户端向服务端发送请求(request),服务端做出应答(response)。本文章主要介绍Golang中http客户端的相关源码,源码主要在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客户端的请求流程和机制。