這個 Go 開源庫讓你能夠更細致地掌握 HTTP 請求過程
大家好,我是歐盆索思(opensource),每天為你帶來優(yōu)秀的開源項目!
在日常開發(fā)中,通過 HTTP 請求其他服務(wù)是常有的事情。通常,我們只需要發(fā)出請求,獲取響應并進行處理即可,處理過程被 http 庫封裝了。然而有沒有辦法更好地掌控請求的細節(jié)呢?今天推薦的這個 Go 語言庫 mediary 就是干這個的。
項目地址:https://github.com/HereMobilityDevelopers/mediary,這個庫是上個月剛開源的。
具體來說,這個庫是將攔截器增加到 http.Client 上,能夠更好地掌控其中的細節(jié),具體來說可以做的事情包括:
- 轉(zhuǎn)儲(dump)請求和響應,輸出到日志;
- 在發(fā)送之前更改請求,或者在返回之前更改響應;
- 使用 Opentracing/Jaeger 添加跟蹤信息;
- 發(fā)送相關(guān)指標到統(tǒng)計監(jiān)控系統(tǒng);
注:攔截器這個概念最早來自 AOP(面向切面編程)。通俗來說,攔截器就是可以在目標動作的前后插入一些代碼,執(zhí)行一些其他的動作。
怎么使用呢?示例如下:
- var client *http.Client
- client = mediary.Init().AddInterceptors(your interceptor).Build()
- client.Get("https://golang.org")
看一個具體的 dump 攔截的例子:
- client := mediary.Init().AddInterceptors(dumpInterceptor).Build()
- client.Get("https://github.com")
- func dumpInterceptor(req *http.Request, handler mediary.Handler) (*http.Response, error) {
- if bytes, err := httputil.DumpRequestOut(req, true); err == nil {
- fmt.Printf("%s", bytes)
- // GET / HTTP/1.1
- // Host: github.com
- // User-Agent: Go-http-client/1.1
- // Accept-Encoding: gzip
- }
- return handler(req)
- }
同時加多個攔截器也是可以的:
- client := mediary.Init().
- AddInterceptors(First Interceptor, Second Interceptor).
- AddInterceptors(Third Interceptor).
- Build()