2016-12-19 14 views
3

Я пытаюсь контролировать сеанс keep-alives, чтобы повторно использовать соединение tcp, создав Trasport.Как добавить информацию заголовков с помощью транспорта в golang net/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

Итак, похоже, что мне не нужно создавать транспорт, поскольку его 'DisableKeepAlives' является ложным по умолчанию. –

+0

Кроме того, если вы собираетесь переопределить «DefaultTransport», вы все равно должны будете скопировать все важные настройки, т. Е. Вы почти всегда хотите DialContext с таймаутом. (а ваши первые 3 поля - это нулевое значение, поэтому их настройка ничего не делает) – JimB

ответ

2

Не смешивайте Client с запросом.
Клиент использует Transport и запустить запрос: client.Do(req)

Вы установите заголовок на http.Request с (h Header) Set(key, value string):

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

Хорошо, дайте мне попробовать. Итак, как мне это сделать, если я хочу настроить транспортную структуру. –

+0

@James Что вы уже делаете. Заголовки, хотя и установлены по запросу. – 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