【问题标题】:Use same headers for every request对每个请求使用相同的标头
【发布时间】:2017-11-24 03:27:08
【问题描述】:

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

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

【问题讨论】:

    标签: http go


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您提供有关使用 RoundTripper 类型的更多详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2010-12-06
    • 1970-01-01
    • 2016-03-31
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多