Compare commits

...

1 Commits

Author SHA1 Message Date
wangyue789 4850284efd fix(client): decode json string data payloads 2026-06-11 10:36:49 +08:00
2 changed files with 30 additions and 1 deletions

View File

@ -138,7 +138,7 @@ func (c *Client) Do(method, path string, body interface{}, query url.Values) (*o
if dataStr, ok := raw["data"].(string); ok { if dataStr, ok := raw["data"].(string); ok {
var parsedData interface{} var parsedData interface{}
if err := json.Unmarshal([]byte(dataStr), &parsedData); err == nil { if err := json.Unmarshal([]byte(dataStr), &parsedData); err == nil {
raw["data"] = json.RawMessage(dataStr) raw["data"] = parsedData
} }
} }

View File

@ -187,6 +187,35 @@ func TestClientDoStatusZero(t *testing.T) {
} }
} }
func TestClientDoParsesJSONStringData(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"status":0,"data":"[{\"id\":1,\"name\":\"demo\"}]"}`))
}))
defer server.Close()
c := &Client{HTTP: server.Client(), BaseURL: server.URL}
env, err := c.Do("GET", "/api/test", nil, nil)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
raw, ok := env.Data.(map[string]interface{})
if !ok {
t.Fatalf("Data = %T, want map[string]interface{}", env.Data)
}
items, ok := raw["data"].([]interface{})
if !ok {
t.Fatalf("nested data = %T, want []interface{}", raw["data"])
}
if len(items) != 1 {
t.Fatalf("expected one parsed item, got %d", len(items))
}
item, ok := items[0].(map[string]interface{})
if !ok || item["name"] != "demo" {
t.Fatalf("unexpected parsed item: %#v", items[0])
}
}
func TestClientDoPaginationMeta(t *testing.T) { func TestClientDoPaginationMeta(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json") w.Header().Set("Content-Type", "application/json")