package upstream import ( "context" "encoding/json" "math" "net/http" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/net/gclient" ) func readQueryResponse(ctx context.Context, response *gclient.Response) ([]byte, error) { defer response.Close() body := response.ReadAll() if preserveUpstreamResults(ctx) { if response.StatusCode < http.StatusOK || response.StatusCode >= http.StatusMultipleChoices { return nil, gerror.Newf("上游查询失败,HTTP状态码:%d", response.StatusCode) } var envelope struct { Code *int `json:"code"` } if err := json.Unmarshal(body, &envelope); err != nil || envelope.Code == nil { return nil, gerror.New("上游响应缺少有效状态码") } } return body, nil } func diagnosisNumericValuePresent(body []byte, index int, field string) bool { var envelope struct { Data []struct { ResData map[string]json.RawMessage `json:"resData"` } `json:"data"` } if json.Unmarshal(body, &envelope) != nil || index >= len(envelope.Data) { return false } raw := envelope.Data[index].ResData[field] var value *float64 return json.Unmarshal(raw, &value) == nil && value != nil && !math.IsNaN(*value) && !math.IsInf(*value, 0) && *value >= 0 }