From e502aeea530f06455154972d4f0fcfa0525b9026 Mon Sep 17 00:00:00 2001 From: Cold <16419454+cold502@user.noreply.gitee.com> Date: Tue, 27 Jan 2026 17:54:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=80=E4=B8=8Bhttp.go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http/http.go | 15 +---------- ragflow/client.go | 66 +++++++++++++++++++++++++++++------------------ 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/http/http.go b/http/http.go index 9f0efd7..285ceec 100644 --- a/http/http.go +++ b/http/http.go @@ -89,20 +89,7 @@ func doRequest(ctx context.Context, method string, url string, headers map[strin defer response.Close() result := response.ReadAll() - // 第三方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()) - } - return - } - - // 内部API:保持原有逻辑,先解析为DefaultHandlerResponse,再提取data字段 + // 统一处理内部API响应格式:{code:200,message:"",data:{...}} resultStrut := &ghttp.DefaultHandlerResponse{} if err = gconv.Struct(result, &resultStrut); err != nil { // 修复:增加err检查 diff --git a/ragflow/client.go b/ragflow/client.go index 502a8c2..f88b0ba 100644 --- a/ragflow/client.go +++ b/ragflow/client.go @@ -2,14 +2,15 @@ package ragflow import ( "context" + "encoding/json" "net/url" "strings" "sync" "sync/atomic" - "gitee.com/red-future---jilin-g/common/http" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/net/gclient" ) var ( @@ -119,21 +120,9 @@ func (r *CommonResponse) IsSuccess() bool { // request 发送 HTTP 请求 // // 为什么不使用 common/http 包: -// -// 1. common/http/http.go:61 会用内部请求的Authorization覆盖RAGFlow API key: -// Httpclient.SetHeader("Authorization", g.RequestFromCtx(ctx).GetHeader("Authorization")) -// 这会导致RAGFlow API认证失败,因为内部token不是RAGFlow的API key -// -// 2. common/http/http.go:69-74 强制解析为内部API响应格式(ghttp.DefaultHandlerResponse): -// resultStrut := &ghttp.DefaultHandlerResponse{} -// if err = gconv.Struct(result, &resultStrut); err != nil { -// err = errors.New(resultStrut.Message) -// } else if resultStrut.Code == 200 || resultStrut.Code == 0 { -// gconv.Struct(resultStrut.Data, target) -// } -// RAGFlow API返回格式与内部API不同,会导致解析失败 -// -// 因此直接使用 g.Client() 调用第三方API,避免上述问题 +// common/http包统一处理内部API响应格式(ghttp.DefaultHandlerResponse), +// RAGFlow API返回格式为{code,data,message}一层结构,与内部API不同。 +// 因此直接使用 g.Client() 调用第三方API,在此处理RAGFlow特有的响应格式。 func (c *Client) request(ctx context.Context, method, path string, body interface{}, result interface{}) (err error) { endpoint := c.getNextEndpoint() if endpoint == "" { @@ -142,26 +131,53 @@ func (c *Client) request(ctx context.Context, method, path string, body interfac fullURL := endpoint + path - // 使用common/http包 - var headers = make(map[string]string) - headers["Authorization"] = "Bearer " + c.APIKey - headers["Content-Type"] = "application/json" + // 创建HTTP客户端并设置RAGFlow专用请求头 + client := g.Client() + client.SetHeader("Authorization", "Bearer "+c.APIKey) + client.SetHeader("Content-Type", "application/json") + + // 发送HTTP请求(避免data展开导致的双重包装) + var response *gclient.Response switch method { case "GET": - err = http.Get(ctx, fullURL, headers, result, body) + if body != nil { + response, err = client.Get(ctx, fullURL, body) + } else { + response, err = client.Get(ctx, fullURL) + } case "POST": - err = http.Post(ctx, fullURL, headers, result, body) + if body != nil { + response, err = client.Post(ctx, fullURL, body) + } else { + response, err = client.Post(ctx, fullURL) + } case "PUT": - err = http.Put(ctx, fullURL, headers, result, body) + if body != nil { + response, err = client.Put(ctx, fullURL, body) + } else { + response, err = client.Put(ctx, fullURL) + } case "DELETE": if body != nil { - err = http.Delete(ctx, fullURL, headers, result, body) + response, err = client.Delete(ctx, fullURL, body) } else { - err = http.Delete(ctx, fullURL, headers, result) + response, err = client.Delete(ctx, fullURL) } default: return gerror.Newf("unsupported method: %s", method) } + + if err != nil { + return + } + defer response.Close() + + // RAGFlow API响应格式:{code,data,message}一层结构,直接解析 + responseBody := response.ReadAll() + if err = json.Unmarshal(responseBody, result); err != nil { + return gerror.Newf("RAGFlow响应解析失败: %v, 原始响应: %s", err, string(responseBody)) + } + return }