我希望能够为HTTP客户端发出的每个请求使用相同的标头,而不必为每个请求指定它们,如下所示:
req, err := http.NewRequest("GET", fmt.Sprintf("https://%s", endpoint), nil)
if err != nil {
log.Printf("Error making request to endpoint: %+v", err)
return p, err
}
req.Header.Add("Authorization", "Bearer")
req.Header.Add("Version", "2017-11-23")
resp, err := client.Do(req)
有没有办法在客户端配置?
答案 0 :(得分:8)
使用函数封装代码以创建和配置请求:
func newRequest(endpoint string) (*http.Request, error) {
req, err := http.NewRequest("GET", fmt.Sprintf("https://%s", endpoint), nil)
if err != nil {
return nil, err
}
req.Header.Add("Authorization", "Bearer")
req.Header.Add("Version", "2017-11-23")
return req, nil
}
更复杂的方法是实现一个round tripper,将标题和代理添加到另一个往返者中:
type transport struct {
underlyingTransport http.RoundTripper
}
func (t *transport) RoundTrip(req *http.Request) (*http.Response, error) {
req.Header.Add("Authorization", "Bearer")
req.Header.Add("Version", "2017-11-23")
return t.underlyingTransport.RoundTrip(req)
}
使用它来创建client,如下所示:
c := http.Client{Transport: &transport{ underlyingTransport: http.DefaultTransport } }
传输会在调用c.Do()
,c.Get()
,c.Post()
等时添加标题。