Go语言中合并多页API返回的Product数组及请求优化疑问
解决方案
核心问题解决:合并多页Products数据
你之前直接拼接响应字节数组的方式错误,因为每个请求返回的是独立的Response结构JSON,无法直接拼接后反序列化。正确的做法是先单独反序列化每一页的响应,再提取其中的Products数组合并到全局切片。
实现步骤(以Go为例)
- 定义正确的结构体(你已经完成这一步):
type Response struct { Data struct { Products []Product `json:"products"` } `json:"data"` } type Product struct { ID int `json:"id"` Name string `json:"name"` // 其他产品字段... }
- 循环请求并合并数据:
import ( "encoding/json" "fmt" "io" "log" "net/http" "strings" ) func fetchAllProducts() ([]Product, error) { var allProducts []Product page := 1 baseURL := "https://your-target-api.com/products" // 替换为你的目标URL for { // 构造带分页参数的请求URL reqURL := fmt.Sprintf("%s?page=%d", baseURL, page) resp, err := http.Get(reqURL) if err != nil { return nil, fmt.Errorf("请求第%d页失败: %w", page, err) } defer resp.Body.Close() // 读取响应体字节 bodyBytes, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("读取第%d页响应失败: %w", page, err) } // 判断服务器返回空JSON的情况,终止循环 if strings.TrimSpace(string(bodyBytes)) == "{}" { break } // 反序列化当前页的响应数据 var pageResp Response if err := json.Unmarshal(bodyBytes, &pageResp); err != nil { return nil, fmt.Errorf("解析第%d页JSON失败: %w", page, err) } // 当前页无产品时,终止循环 if len(pageResp.Data.Products) == 0 { break } // 将当前页产品追加到全局切片 allProducts = append(allProducts, pageResp.Data.Products...) // 页码自增,进入下一页请求 page++ } return allProducts, nil }
循环终止判断逻辑
代码中已经实现两种终止条件:
- 服务器返回空JSON(
strings.TrimSpace(string(bodyBytes)) == "{}") - 当前页的
Products数组为空(len(pageResp.Data.Products) == 0)
覆盖了你提到的「返回200但空JSON」的停止场景。
合并 vs 分批发送给前端的选择
选合并的场景
- 总数据量小(几百条以内),后端内存压力可忽略
- 前端需要一次性展示所有数据(比如导出全量数据、小型列表)
- 实现简单,无需前后端做分页交互
选分批发送的场景
- 总数据量大(上千条及以上),避免后端一次性加载大量数据导致内存占用过高
- 前端需要做「加载更多」或分页展示,提升用户体验(避免长时间等待)
- 可以设计成前端触发式分页:前端每次请求下一页,后端直接返回当前页的
Products数据;或者后端用流式响应逐步返回合并后的结果。
内容的提问来源于stack exchange,提问作者ADEXITUM
相关产品推荐
相关产品推荐

