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

sag*_*r89 3 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)
Run Code Online (Sandbox Code Playgroud)

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

Cer*_*món 11

使用函数封装代码以创建和配置请求:

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
}
Run Code Online (Sandbox Code Playgroud)

更复杂的方法是实现一个往返者,将标题和代表添加到另一个往返者:

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)
}
Run Code Online (Sandbox Code Playgroud)

用它来创建这样的客户端:

c := http.Client{Transport: &transport{ underlyingTransport: http.DefaultTransport } }
Run Code Online (Sandbox Code Playgroud)

运输将报头的调用c.Do(),c.Get(),c.Post(),等.