2016-12-19 74 views
3

我想通過創建一個Trasport來控制保持活動會話重用tcp連接。如何添加標頭信息使用傳輸在golang淨/ http

這是我的代碼片段,我不確定如何爲認證添加標頭信息。

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) 
+0

你不知道。頭文件來自'* http.Request'。 DisableKeepAlives的默認值爲false,這意味着連接將盡可能重用。 – JimB

+0

因此,看起來我不需要創建Transport,因爲它的'DisableKeepAlives'默認爲false。 –

+0

另外,如果你打算重寫'DefaultTransport',你仍然應該確保你複製了所有重要的設置,即你幾乎總是需要一個帶有Timeout的DialContext。 (並且你的前3個字段是零值,所以設置它們什麼都不做) – JimB

回答

2

不要混合請求中的Client
客戶端使用一個Transport和運行要求:client.Do(req)

您在設置標題中的http.Request(h Header) Set(key, value string)

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

好吧,讓我試試。所以,我應該怎麼做,如果我想定製傳輸結構。 –

+0

@詹姆斯你已經在做什麼。儘管在請求中設置了標題。 – VonC

+0

在這裏,我正嘗試使用多個goroutine。所以,想到只創建一次並重用它。 –

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)) 
    } 

和它的作品。

+2

這似乎符合我在我的回答中推薦的內容。 +1 – VonC