2016-12-19 2 views
3

Ich versuche, Keep-Alives-Sitzung zu steuern, die TCP-Verbindung durch Erstellen eines Trasport wieder zu verwenden.So fügen Sie Header-Informationen mithilfe von Transport in Golang Net/http

Hier ist mein Snippet und ich bin mir nicht sicher, wie man Header-Informationen für die Authentifizierung hinzufügen kann.

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

Sie nicht. Die Header werden aus dem '* http.Request' entnommen. Der Standardwert für DisableKeepAlives ist false. Dies bedeutet, dass Verbindungen nach Möglichkeit wiederverwendet werden. – JimB

+0

Sieht so aus, als müsste ich Transport nicht erstellen, da seine 'DisableKeepAlives' standardmäßig falsch ist. –

+0

Wenn Sie den 'DefaultTransport' überschreiben, sollten Sie trotzdem sicherstellen, dass Sie alle wichtigen Einstellungen kopieren, d. H. Sie möchten fast immer einen DialContext mit einem Timeout. (und Ihre ersten 3 Felder sind der Wert Null, so dass die Einstellung nichts tut) – JimB

Antwort

2

Mischen Sie nicht die Client aus der Anfrage.
Der Client verwendet einen Transport und die Anfrage auszuführen: client.Do(req)

Sie setzen Header auf der http.Request mit (h Header) Set(key, value string):

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

Ok lass mich es versuchen. Also, wie soll ich tun, wenn ich die Transport-Struktur anpassen möchte. –

+0

@James Was du schon machst. Die Header sind jedoch auf die Anfrage festgelegt. – VonC

+0

Hier versuche ich durch mehrere Goroutine zu verwenden. Also gedacht, nur einmal zu erstellen und es wiederzuverwenden. –

0

Dies ist, was ich gefunden habe:

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

Und es funktioniert.

+2

Das scheint im Einklang mit dem, was ich in meiner Antwort empfohlen habe. +1 – VonC

Verwandte Themen