版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/benben_2015/article/details/84863497
在net/http
标准包的client.go
文件中,Post
方法使用POST
请求方式访问指定的URL
。下面是标准包中的定义,可以看到它是对DefaultClient.Post
方法的包裹。如果你想使用自定义的headers
,那么需要使用NewRequest
和DefaultClient.Do
方法。
func Post(url, contentType string, body io.Reader) (resp *Response, err error) {
return DefaultClient.Post(url, contentType, body)
}
DefaultClient
是默认的客户端,它支持GET
,HEAD
和POST
请求方式。
var DefaultClient = &Client{}
同时Go
还提供了对应的接口,在Client
结构体上调用这个接口。接口如下:
func (c *Client) Post (url, contentType string, body io.Reader) (resp *Response,err error) {
req, err := NewRequest("POST", url, body)
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", contentType)
return c.Do(req)
}
NewRequest
方法通过传入请求方式method
,请求的URL
以及可选的body
,来返回一个新的请求结构。如果给定的body
是io.Closer
,那么返回的Request.Body
在Client
调用Do
,Post
和PostForm
方法时会被关闭。
func NewRequest(method, url string, body io.Reader) (*Request, error) {
/*
...
req := &Request{
Method: method,
URL: u,
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
Header: make(Header),
Body: rc,
Host: u.Host,
}
....
*/
}
由于此方法返回的Request
,Header
是一个空的结构,所以还需要根据需要,设置它的Content-Type
。
在设置好这些后,它会遵循你在client
中配置的内容,通过调用Do
接口来发送HTTP
请求,然后返回HTTP响应。
func (c *Client) Do(req *Request) (*Response, error) {
return c.do(req)
}
Client
结构体表示HTTP
客户端,空的结构体任然是可以使用的客户端,它使用DefaultTransport
。客户端的传入通常具有内部状态(缓存的TCP
连接),因此应该复用客户端,而不是根据需要频繁创建客户端。Client
是并发安全的,它处理HTTP
事务比RoundTripper
高级,例如cookies
和redirects
。
type Client struct {
//Transport定义了单个HTTP请求的机制,如果为nil,则使用DefaultTransport
Transport RoundTripper
//CheckRedirect定义了重定向处理的策略,如果CheckRedirect不为空,那么客户端在HTTP跳转之前,先调用此方法。
CheckRedirect func(req *Request, via []*Request) error
Jar CookieJar
//Timeout指定客户端发出请求的时间限制,这个时间包括,连接时间,任何重定向和读取响应正文的时间,Get,Head,Post或Do返回后,计时器任然运行,并将终端Response.Body的读取
Timeout time.Duration
}
有关Transport
和RoundTripper
的讲解,后续文章再做介绍。
参考文章