为每个请求使用相同的标头

时间:2017-11-24 03:27:08

标签: http go

我希望能够为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)

有没有办法在客户端配置?

1 个答案:

答案 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()等时添加标题。