2016-12-19 4 views
3

J'essaie de contrôler la session keep-alives pour réutiliser la connexion tcp en créant un Trasport.Comment ajouter des informations d'en-tête à l'aide de Transport dans golang net/http

Voici mon extrait et je ne suis pas sûr de savoir comment ajouter des informations d'en-tête pour l'authentification.

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

Ce n'est pas le cas. Les en-têtes proviennent du '* http.Request'. La valeur par défaut pour DisableKeepAlives est false, ce qui signifie que les connexions seront réutilisées autant que possible. – JimB

+0

Donc, il semble que je n'ai pas besoin de créer Transport car son 'DisableKeepAlives' est faux par défaut. –

+0

En outre, si vous voulez remplacer le DefaultTransport, vous devez toujours vous assurer de copier tous les paramètres importants, c'est-à-dire que vous voulez presque toujours un DialContext avec un Timeout. (et vos 3 premiers champs sont la valeur zéro, donc la configuration de ceux-ci ne fait rien) – JimB

Répondre

2

Ne pas mélanger le Client de la demande.
Le client utilise un Transport et exécuter la demande: client.Do(req)

Vous définissez en-tête sur le http.Request avec (h Header) Set(key, value string):

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

Ok laissez-moi essayer. Alors, comment dois-je faire si je veux personnaliser la structure de transport. –

+0

@James Ce que vous faites déjà. Les en-têtes sont définis à la demande. – VonC

+0

Ici, j'essaie d'utiliser par plusieurs goroutine. Donc, pensé à créer une seule fois et à le réutiliser. –

0

Ce que j'ai trouvé:

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

Et cela fonctionne.

+2

Cela semble conforme à ce que j'ai recommandé dans ma réponse. +1 – VonC