go的net/http标准库提供了一套完整的http请求和响应服务
服务端部分:go标准库---net/http服务端
今天从客户端的角度来学习分析下,受限介绍Client相关的数据结构。
1、数据结构
(1)对应服务端,客户端也封装了一个对象,相较Server,Client的成员少一些,其中最主要的就是Transport,负责客户端请求发起到返回响应的实现。
type Client struct {
Transport RoundTripper //http请求的具体实现
Jar CookieJar // cookie
Timeout time.Duration //超时
}
(2) Transport是一个RoundTripper的接口类型,该接口类型实现一个RoundTrip方法,该方法负责实现传入请求,返回请求对应的响应,是客户端请求的核心
type RoundTripper interface {
RoundTrip(*Request) (*Response, error)
}
(3) Request是请求的结构体,包含了请求方法、请求体、请求地址,协议等信息
type Request struct {
Method string //请求方法
URL *url.URL //请求的地址信息
Header Header //请求头
Proto string // 协议
Body io.ReadCloser //请求体
Host string //服务器主机
Response *Response
// ...
}
(4)Response响应体,包含请求状态、协议、响应头、响应体、请求体等
type Response struct {
StatusCode int // 请求状态
Proto string // 协议
Header Header //相应头
Body io.ReadCloser // 响应体
Request *Request // 对应的请求体
// ...
}
2、流程分析
以Post请求为例,按照如下的请求函数进行梳理,如果直接调用标准库的请求函数,将使用默认的客户端实例DefaultClient,入参有路径和文本类型一级请求体参数
var DefaultClient = &Client{}
func Post(url, contentType string, body io.Reader) (resp *Response, err error) {
return DefaultClient.Post(url, contentType, body)
}
在Client.Post中,首先根据传入