Go 对HTTP POST的支持

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/benben_2015/article/details/84863497

net/http标准包的client.go文件中,Post方法使用POST请求方式访问指定的URL。下面是标准包中的定义,可以看到它是对DefaultClient.Post方法的包裹。如果你想使用自定义的headers,那么需要使用NewRequestDefaultClient.Do方法。

func Post(url, contentType string, body io.Reader) (resp *Response, err error) {
	return DefaultClient.Post(url, contentType, body)
}

DefaultClient是默认的客户端,它支持GET,HEADPOST请求方式。

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,来返回一个新的请求结构。如果给定的bodyio.Closer,那么返回的Request.BodyClient调用DoPostPostForm方法时会被关闭。

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,
	}
	....
	*/
}

由于此方法返回的RequestHeader是一个空的结构,所以还需要根据需要,设置它的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高级,例如cookiesredirects

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
}

有关TransportRoundTripper的讲解,后续文章再做介绍。

参考文章

  1. Go client

猜你喜欢

转载自blog.csdn.net/benben_2015/article/details/84863497