This commit is contained in:
Cold
2026-01-17 17:58:13 +08:00
committed by 张斌
parent 138b81640c
commit 02e75e57da
5 changed files with 49 additions and 15 deletions

View File

@@ -14,6 +14,7 @@ import (
"gitee.com/red-future---jilin-g/common/log/controller"
"gitee.com/red-future---jilin-g/common/utils"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/gclient"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/net/gsvc"
"github.com/gogf/gf/v2/os/gtime"
@@ -60,49 +61,86 @@ func doRequest(ctx context.Context, method string, url string, headers map[strin
if err != nil {
return
}
client := Httpclient
client := Httpclient.Clone()
// POST/PUT/DELETE请求都需要显式用ContentJson序列化body
if (method == http.MethodPost || method == http.MethodPut || method == http.MethodDelete) && len(data) > 0 {
client = client.ContentJson()
}
// 最后设置headers确保不会被ContentJson覆盖
if len(headers) > 0 {
client = Httpclient.Clone()
client.SetHeaderMap(headers)
} else {
client.SetHeader("Authorization", g.RequestFromCtx(ctx).GetHeader("Authorization"))
}
if method == http.MethodDelete && len(data) > 0 { // DELETE请求显式用ContentJson序列化body
client = client.ContentJson()
// 修复避免data...展开导致的双重包装问题
// 当只有一个元素时,直接传递该元素,避免被包装成数组
var response *gclient.Response
if len(data) == 1 {
response, err = client.DoRequest(ctx, method, url, data[0])
} else {
response, err = client.DoRequest(ctx, method, url, data...)
}
response, err := client.DoRequest(ctx, method, url, data...)
if err != nil {
return
}
defer response.Close()
result := response.ReadAll()
// 添加调试日志:打印原始响应
g.Log().Debugf(ctx, "[HTTP] 原始响应: %s", string(result))
// 第三方API特例RAGFlow等第三方API响应格式为{code,data,message}一层结构直接解析原始JSON到target
// 内部API格式为{code:200,message:"",data:{...}}两层结构需经过DefaultHandlerResponse二次解析
// 判断依据URL包含/api/v1/不影响内部API调用
isThirdPartyAPI := strings.Contains(url, "/api/v1/")
if isThirdPartyAPI {
// 第三方API特例直接解析原始JSON到target不经过DefaultHandlerResponse
if err = gconv.Struct(result, target); err != nil {
return errors.New("第三方API响应解析失败: " + err.Error())
}
g.Log().Debugf(ctx, "[HTTP] 第三方API直接解析target: %+v", target)
return
}
// 内部API保持原有逻辑先解析为DefaultHandlerResponse再提取data字段
resultStrut := &ghttp.DefaultHandlerResponse{}
if err = gconv.Struct(result, &resultStrut); err != nil { // 修复增加err检查
return errors.New("响应解析失败: " + err.Error())
}
// 添加调试日志:打印解析后的结构
g.Log().Debugf(ctx, "[HTTP] 解析后结构: Code=%d, Message=%s, Data类型=%T, Data值=%+v",
resultStrut.Code, resultStrut.Message, resultStrut.Data, resultStrut.Data)
if resultStrut.Code == 200 || resultStrut.Code == 0 {
if err = gconv.Struct(resultStrut.Data, target); err != nil { // 修复增加err检查
return errors.New("数据解析失败: " + err.Error())
}
// 添加调试日志打印最终的target
g.Log().Debugf(ctx, "[HTTP] 最终target: %+v", target)
} else {
err = errors.New(resultStrut.Message)
}
return
}
func Get(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodGet, url, headers, target, data)
err = doRequest(ctx, http.MethodGet, url, headers, target, data...)
return
}
func Post(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodPost, url, headers, target, data)
err = doRequest(ctx, http.MethodPost, url, headers, target, data...)
return
}
func Put(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodPut, url, headers, target, data)
err = doRequest(ctx, http.MethodPut, url, headers, target, data...)
return
}
func Delete(ctx context.Context, url string, headers map[string]string, target any, data ...any) (err error) {
err = doRequest(ctx, http.MethodDelete, url, headers, target, data)
err = doRequest(ctx, http.MethodDelete, url, headers, target, data...)
return
}