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