sager89 sager89 - 11 months ago 124
HTTP Question

Use same headers for every request

I want to be able to use the same headers for every request made by an HTTP client without having to specify them for every request like so:

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)


Is there a way to configure this on the client?

Answer Source

Use a function to encapsulate the code to create and configure the request:

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
}

A more complicated approach is to implement a round tripper that adds the headers and delegates to another 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)
}

Use it to create a client like this:

c := http.Client{Transport: &transport{ underlyingTransport: http.DefaultTransport } }

The transport adds the headers on calls to c.Do(), c.Get(), c.Post(), etc.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download