Golang中如何实现API响应数据的分页处理

Golang中如何实现API响应数据的分页处理 我有一个需要分页遍历的API响应:

func getAllOrgs() []int {
	var allOrgIds []int
	var listOfAllOrganizations Orgs
	var x = 1
	for x == 1 {
		if listOfAllOrganizations.Nextpage != nil {
                 DO CODE HERE
}

下一页的URL结构是 http://someurl.com?page=PAGENUBMER

当API响应中没有更多页面需要生成该链接时,next_page 看起来像 next_page:null

我该如何将 nil 与 null 进行比较?我尝试过将 Nextpage 设置为 *string,也尝试过设置 listofallorges.nextpage != ""

但它从未被求值。


更多关于Golang中如何实现API响应数据的分页处理的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

@skillian

你说得对,不过我确实搞明白了。我的结构体是:

type Orgs struct {
    // ???
    Nextpage string `json:"next_page"`
    // ???
}

而不是将 Nextpage 设置为指针。不过还是谢谢你!

更多关于Golang中如何实现API响应数据的分页处理的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据提供的代码片段,我们无法确定具体发生了什么。根据您写的“next_page:null”,我猜测API可能返回JSON,并且您的Orgs结构体可能包含这样一个字段:

type Orgs struct {
    // ???
    Nextpage *string `json:"next_page"`
    // ???
}

同时,我也猜测您在那个循环内部(或外部?)的某个地方正在进行JSON反序列化。然而,由于所有重要的操作都发生在其他地方,我们无法提供太多帮助。

在Golang中处理API分页时,next_page: null通常会被解析为nil。你需要使用指针类型来正确比较,并确保JSON解析正确。以下是完整的实现示例:

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

type Orgs struct {
	OrgIDs   []int   `json:"org_ids"`
	NextPage *string `json:"next_page"` // 使用指针类型处理null
}

func getAllOrgs() []int {
	var allOrgIds []int
	baseURL := "http://someurl.com?page=%d"
	page := 1

	for {
		// 构建请求URL
		url := fmt.Sprintf(baseURL, page)
		resp, err := http.Get(url)
		if err != nil {
			panic(err)
		}
		defer resp.Body.Close()

		// 读取响应
		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}

		// 解析JSON
		var orgs Orgs
		err = json.Unmarshal(body, &orgs)
		if err != nil {
			panic(err)
		}

		// 收集数据
		allOrgIds = append(allOrgIds, orgs.OrgIDs...)

		// 检查是否有下一页
		if orgs.NextPage == nil {
			break // next_page为null,结束循环
		}

		page++
	}

	return allOrgIds
}

// 或者使用NextPage作为完整URL的示例
type OrgsWithURL struct {
	OrgIDs   []int   `json:"org_ids"`
	NextPage *string `json:"next_page"`
}

func getAllOrgsWithNextURL() []int {
	var allOrgIds []int
	nextURL := "http://someurl.com?page=1"

	for nextURL != "" {
		resp, err := http.Get(nextURL)
		if err != nil {
			panic(err)
		}
		defer resp.Body.Close()

		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}

		var orgs OrgsWithURL
		err = json.Unmarshal(body, &orgs)
		if err != nil {
			panic(err)
		}

		allOrgIds = append(allOrgIds, orgs.OrgIDs...)

		// 更新下一页URL
		if orgs.NextPage != nil {
			nextURL = *orgs.NextPage
		} else {
			nextURL = ""
		}
	}

	return allOrgIds
}

func main() {
	// 使用页码分页
	orgIDs := getAllOrgs()
	fmt.Printf("获取到 %d 个组织ID\n", len(orgIDs))

	// 使用NextPage URL分页
	orgIDs2 := getAllOrgsWithNextURL()
	fmt.Printf("获取到 %d 个组织ID\n", len(orgIDs2))
}

如果你的API响应中next_page字段直接包含完整的URL,可以使用第二种方法。关键点是:

  1. 使用*string指针类型来区分null和空字符串
  2. 通过检查orgs.NextPage == nil来判断是否有下一页
  3. NextPage不为nil时,使用*orgs.NextPage获取实际的URL值

如果你的JSON响应中next_page字段是数字页码而不是完整URL,可以这样处理:

type OrgsWithPageNum struct {
	OrgIDs   []int `json:"org_ids"`
	NextPage *int  `json:"next_page"` // 使用指针类型处理null
}

func getAllOrgsWithPageNum() []int {
	var allOrgIds []int
	page := 1

	for {
		url := fmt.Sprintf("http://someurl.com?page=%d", page)
		resp, err := http.Get(url)
		if err != nil {
			panic(err)
		}
		defer resp.Body.Close()

		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}

		var orgs OrgsWithPageNum
		err = json.Unmarshal(body, &orgs)
		if err != nil {
			panic(err)
		}

		allOrgIds = append(allOrgIds, orgs.OrgIDs...)

		// 检查是否有下一页
		if orgs.NextPage == nil {
			break
		}

		page = *orgs.NextPage
	}

	return allOrgIds
}

确保你的结构体字段标签与JSON响应中的字段名完全匹配,并且使用正确的指针类型来处理null值。

回到顶部