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?
http. DuplicateHeader if the client sends an HTTP request with particular header more than once or with multiple values for the HTTP headers which are not allowed to have duplicates/multiple values in Apigee Edge. Similarly, you will get 502 Bad Gateway with error code protocol. http.
Angular Interceptors technique comes in handy when you need to transform each request data, for instance, send an authorization token header with every HTTP request.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With