2025-10-16 13:28:24 +08:00

111 lines
3.2 KiB
Go

package httpclient
import (
"mini-chat/internal/pkg/core"
"mini-chat/internal/pkg/trace"
"github.com/bytedance/sonic"
"github.com/go-resty/resty/v2"
)
type customInterceptor struct {
ctx core.StdContext
}
func (i *customInterceptor) OnResponse(client *resty.Client, response *resty.Response) error {
requestInfo := map[string]interface{}{
"request-id": i.ctx.Trace.ID(),
"url": response.Request.URL,
"method": response.Request.Method,
"header": response.Request.Header,
"path_params": response.Request.PathParams,
"body": response.Request.Body,
"request_time": response.Request.Time.Format("2006-01-02 15:04:05"),
"ti-DNSLookup": response.Request.TraceInfo().DNSLookup,
"ti-ConnTime": response.Request.TraceInfo().ConnTime.String(),
"ti-TCPConnTime": response.Request.TraceInfo().TCPConnTime.String(),
"ti-TLSHandshake": response.Request.TraceInfo().TLSHandshake.String(),
"ti-ServerTime": response.Request.TraceInfo().ServerTime.String(),
"ti-IsConnReused": response.Request.TraceInfo().IsConnReused,
"ti-IsConnWasIdle": response.Request.TraceInfo().IsConnWasIdle,
"ti-ConnIdleTime": response.Request.TraceInfo().ConnIdleTime.String(),
"ti-RequestAttempt": response.Request.TraceInfo().RequestAttempt,
"ti-RemoteAddr": response.Request.TraceInfo().RemoteAddr.String(),
}
responseInfo := map[string]interface{}{
"status_code": response.StatusCode(),
"status": response.Status(),
"proto": response.Proto(),
"header": response.Header(),
"total_time": response.Request.TraceInfo().TotalTime.String(),
"received_at": response.ReceivedAt().Format("2006-01-02 15:04:05"),
"body": string(response.Body()),
}
httpLog := new(trace.HttpLog)
httpLog.Request = requestInfo
httpLog.Response = responseInfo
httpLog.CostSeconds = response.Time().Seconds()
i.ctx.Trace.AppendThirdPartyRequests(httpLog)
return nil
}
func (i *customInterceptor) OnError(request *resty.Request, err error) {
requestInfo := map[string]interface{}{
"request-id": i.ctx.Trace.ID(),
"url": request.URL,
"method": request.Method,
"header": request.Header,
"path_params": request.PathParams,
"body": request.Body,
"request_time": request.Time.Format("2006-01-02 15:04:05"),
}
responseInfo := map[string]interface{}{
"error": err.Error(),
}
httpLog := new(trace.HttpLog)
httpLog.Request = requestInfo
httpLog.Response = responseInfo
httpLog.CostSeconds = request.TraceInfo().TotalTime.Seconds()
i.ctx.Trace.AppendThirdPartyRequests(httpLog)
}
func GetHttpClientWithContext(ctx core.StdContext) *resty.Client {
client := resty.New().
EnableTrace().
SetJSONUnmarshaler(func(data []byte, v interface{}) error {
// 配置 Sonic 宽松模式
return sonic.Config{
ValidateString: false,
}.Froze().Unmarshal(data, v)
})
interceptor := &customInterceptor{
ctx: ctx,
}
client.OnAfterResponse(interceptor.OnResponse)
client.OnError(interceptor.OnError)
return client
}
func GetHttpClient() *resty.Client {
return resty.New().
EnableTrace().
SetJSONUnmarshaler(func(data []byte, v interface{}) error {
// 配置 Sonic 宽松模式
return sonic.Config{
ValidateString: false,
}.Froze().Unmarshal(data, v)
})
}