Регистрация всех HTTP-запросов и ответов от done через HTTP-клиент

# #http #go #logging

Вопрос:

У меня есть следующее простое http.Client :

 import (
 "net/http"
 "log"
)
...
func main() {
   ...
   link = "http://example.com"
   method = "GET"
   req, _ := http.NewRequest(method, link, nil)

   client := amp;http.Client{}

   myZapLogger.Info("Sending a %s request to %sn", method, link)

   resp, err := client.Do(req)
   if err != nil {
      myZapLogger.Error(..., err) // I'm logging rather than fatal-ing or so
   } else { 
      myZapLogger.Info("Received a %d on request X", resp.StatusCode)
   }
   ...
}

...
 

Я искал способ выполнить вышеуказанное для каждого запроса с помощью крючка (или около того), чтобы он срабатывал автоматически каждый раз. Я могу написать функцию, которая включает все это, но в случае, когда я передаю http-клиент в какой-либо другой пакет, я не смогу контролировать/регистрировать такие запросы таким образом (например aws-go-sdk ).

Есть ли способ сделать это с помощью контекстов или прикрепления крючков к клиенту?

Спасибо

Комментарии:

1. Ретушь http. Взаимодействие с круговыми поездками в http. Клиент. Транспорт.

2. Ага. Я только что понял, что это выполнимо таким образом; не стесняйтесь давать ответ, если вам так хочется.

Ответ №1:

комментарий юдора отвечает на вопрос; я просто введу его в код:

 type MyRoundTripper struct {}

func (t MyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
    
    // Do work before the request is sent

    resp, err := http.DefaultTransport.RoundTrip(req)
    if err != nil {
        return resp, err
    }
    
    // Do work after the response is received

    return resp, err
}
 

Чтобы использовать его, вы просто передадите его своему HTTP-клиенту:

 rt := MyRoundTripper{}
client := http.Client{Transport: rt}