如何使用golang net / http中的Transport添加标题信息

时间:2016-12-19 19:30:55

标签: go net-http transport

我正在尝试通过创建Trasport来控制keep-alives会话以重用tcp连接。

这是我的代码段,我不知道如何添加标头信息以进行身份​​验证。

url := "http://localhost:8181/api/v1/resource"
tr := &http.Transport{
    DisableKeepAlives:   false,
    MaxIdleConns:        0,
    MaxIdleConnsPerHost: 0,
    IdleConnTimeout:     time.Second * 10,
}
client := &http.Client{Transport: tr}
resp, err := client.Get(url)

3 个答案:

答案 0 :(得分:3)

请勿混合请求中的Client 客户端使用Transport并运行请求:client.Do(req)

您使用http.Request设置了(h Header) Set(key, value string)标题:

req.Header.Set("name", "value")

答案 1 :(得分:3)

对于特定问题,这可能不是您想要的-在您的情况下,将其设置在请求中更为合理,但是要直接回答您的问题,您应该能够向所有通过通过使用用于运输的自定义RoundTrip方法进行运输。

签出https://golang.org/pkg/net/http/#RoundTripper

类似的东西:

type CustomTransport struct {
  http.RoundTripper
}

func (ct *CustomTransport) RoundTrip(req *http.Request) (*http.Response, error) {
    req.Header.Add("header-key", "header-value")
    return ct.RoundTripper.RoundTrip(req)
}

url := "http://localhost:8181/api/v1/resource"
tr := &CustomTransport{
    DisableKeepAlives:   false,
    MaxIdleConns:        0,
    MaxIdleConnsPerHost: 0,
    IdleConnTimeout:     time.Second * 10,
}
client := &http.Client{Transport: tr}
resp, err := client.Get(url)

当我无法直接访问API客户端库(或直接每个请求对象)使用的http客户端时,我发现这很有用,但它允许我传递传输。

答案 2 :(得分:0)

这是我发现的:

    package main

    import (
        "fmt"
        "io/ioutil"
        "net/http"
    )

    var URL = "http://httpbin.org/ip"

    func main() {
        tr := &http.Transport{DisableKeepAlives: false}
        req, _ := http.NewRequest("GET", URL, nil)
        req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", "Token"))
        req.Close = false

        res, err := tr.RoundTrip(req)
        if err != nil {
            fmt.Println(err)
        }
        body, _ := ioutil.ReadAll(res.Body)
        fmt.Println(string(body))
    }

它有效。