fix(router): 修复SC银行资质校验接口的请求体转发问题并添加详细日志

新增formatHeaders工具函数以格式化日志中的HTTP头
预先读取完整请求体到缓冲区,修复重复读取请求流导致的转发body为空问题
完善转发日志,新增打印请求查询参数、请求头、请求体、响应头和响应体
This commit is contained in:
fuzhongyun 2026-06-26 11:07:37 +08:00
parent dadb388d79
commit 2954ab5fc5
1 changed files with 18 additions and 3 deletions

View File

@ -4,6 +4,7 @@ import (
errors "ai_scheduler/internal/data/error" errors "ai_scheduler/internal/data/error"
"ai_scheduler/internal/gateway" "ai_scheduler/internal/gateway"
"ai_scheduler/internal/services" "ai_scheduler/internal/services"
"bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
@ -158,11 +159,14 @@ func forwardToPythonService(c *fiber.Ctx) error {
} }
func forwardScbankQualification(c *fiber.Ctx) error { func forwardScbankQualification(c *fiber.Ctx) error {
requestBody := c.Body()
requestQuery := c.Context().QueryArgs().String()
// 调用外部权益接口前记录目标地址与关键请求信息,便于排查白名单和超时问题。 // 调用外部权益接口前记录目标地址与关键请求信息,便于排查白名单和超时问题。
startAt := time.Now() startAt := time.Now()
log.Printf("开始转发权益校验请求 | method=%s | path=%s | target=%s", c.Method(), c.Path(), scbankQualificationProxyURL) log.Printf("开始转发权益校验请求 | method=%s | path=%s | target=%s | query=%s | headers=%s | body=%s", c.Method(), c.Path(), scbankQualificationProxyURL, requestQuery, formatHeaders(c.GetReqHeaders()), string(requestBody))
req, err := http.NewRequestWithContext(c.Context(), c.Method(), scbankQualificationProxyURL, c.Context().Request.BodyStream()) req, err := http.NewRequestWithContext(c.Context(), c.Method(), scbankQualificationProxyURL, bytes.NewReader(requestBody))
if err != nil { if err != nil {
log.Printf("创建权益中转请求失败 | target=%s | err=%v", scbankQualificationProxyURL, err) log.Printf("创建权益中转请求失败 | target=%s | err=%v", scbankQualificationProxyURL, err)
return c.Status(fiber.StatusInternalServerError).SendString(err.Error()) return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
@ -200,11 +204,22 @@ func forwardScbankQualification(c *fiber.Ctx) error {
return c.Status(fiber.StatusInternalServerError).SendString(err.Error()) return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
} }
log.Printf("权益中转请求完成 | target=%s | status=%d | cost=%s", scbankQualificationProxyURL, resp.StatusCode, time.Since(startAt)) log.Printf("权益中转请求完成 | target=%s | status=%d | cost=%s | headers=%s | body=%s", scbankQualificationProxyURL, resp.StatusCode, time.Since(startAt), formatHeaders(resp.Header), string(body))
c.Status(resp.StatusCode) c.Status(resp.StatusCode)
return c.Send(body) return c.Send(body)
} }
func formatHeaders(headers map[string][]string) string {
if len(headers) == 0 {
return "{}"
}
data, err := json.Marshal(headers)
if err != nil {
return "{}"
}
return string(data)
}
func routerSocket(app *fiber.App, chatService *services.ChatService) { func routerSocket(app *fiber.App, chatService *services.ChatService) {
ws := app.Group("ws/v1/") ws := app.Group("ws/v1/")
// WebSocket 路由配置 // WebSocket 路由配置