标准库的net/http包提供了HTTP客户端和服务端的实现,本文通过几个主要的结构体来了解http包中与客户端相关的主要功能。
- Client
client 负责把请求发送给server端,通过一个http.Transport实例指定http请求的低级别配置,如果没有配置会用一个默认的DefualtTransport实例代替。
1 | golang复制代码// A Client is an HTTP client. Its zero value (DefaultClient) is a usable client that uses DefaultTransport. |
Do()方法最终都会调用RoundTrip处理请求
1 | golang复制代码// send issues an HTTP request. |
为http.Client配置Transport实例
1 | golang复制代码tr := &http.Transport{ |
Client结构体提供的发送http请求的方法:
Do()接收一个http.Request参数,其他几个请求内部都是调用Do()方法
Get(),Head(),
Post(),可以自定义contentType,接收一个body数据
1 | golang复制代码func (c *Client) Post(url, contentType string, body io.Reader) (resp *Response, err error) { |
PostForm(),也是发送一个post请求,区别在于PostForm的contentType固定为”application/x-www-form-urlencoded”,接收一个url.Values类型的数据,再将数据编码为”URL编码”形式(“bar=baz&foo=quux”),
1 | golang复制代码func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error) { |
CloseIdleConnections(),关闭以前请求的但现在处于“keep-alive”状态的所有连接。它不会中断任何当前正在使用的连接。
- Transport
配置http请求的低级别信息的结构体
1 | golang复制代码Package: |
http.Client实际执行请求时会带上Transport实例,如果没配置就用默认的DefaultTransport
1 | golang复制代码func (c *Client) send(req *Request, deadline time.Time) (resp *Response, didTimeout func() bool, err error) { |
- Request
Request代表通过一个Server接收的请求,或者一个通过Client发送的请求。
1 | golang复制代码//A Request represents an HTTP request received by a server or to be sent by a client. |
- Cookie
Cookie表示在HTTP响应Header中的”Set-Cookie”,或HTTP请求header中的”Cookie”发送的HTTP Cookie。
1 | golang复制代码type Cookie struct { |
- Response
Response表示来自HTTP请求的响应。
Http.Client和http.Transport 返回Response,一旦这个response header 被接收完,Response的body字段需要被当作流来处理。
1 | golang复制代码type Response struct { |
本文转载自: 掘金