You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中合并多页API返回的Product数组及请求优化疑问

解决方案

核心问题解决:合并多页Products数据

你之前直接拼接响应字节数组的方式错误,因为每个请求返回的是独立的Response结构JSON,无法直接拼接后反序列化。正确的做法是先单独反序列化每一页的响应,再提取其中的Products数组合并到全局切片。

实现步骤(以Go为例)

  1. 定义正确的结构体(你已经完成这一步):
type Response struct {
    Data struct {
        Products []Product `json:"products"`
    } `json:"data"`
}

type Product struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    // 其他产品字段...
}
  1. 循环请求并合并数据:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:15:22