Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use same headers for every request

Tags:

http

go

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?

like image 359
sager89 Avatar asked Nov 24 '17 03:11

sager89


People also ask

Can HTTP headers be repeated?

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.

What would you use to attach the same header to all your HTTP calls?

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.


1 Answers

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.

like image 169
Bayta Darell Avatar answered Oct 11 '22 13:10

Bayta Darell