NueForm

分页

了解如何使用基于页码的分页浏览 NueForm API 列表端点,包括查询参数、响应元数据和迭代示例。

所有返回资源列表的 NueForm API 端点都支持基于页码的分页。本指南介绍查询参数、响应格式以及遍历所有结果的模式。

查询参数

使用两个查询参数控制分页:

参数类型默认值描述
pageinteger1要获取的页码(从 1 开始)。
per_pageinteger20每页的项目数。最小值:1,最大值:100

如果 per_page 超过 100,API 会自动将其限制为 100。小于 1 的值默认为 1。

请求示例

GET/api/v1/forms?page=2&per_page=25
curl
curl -X GET "https://app.nueform.com/api/v1/forms?page=2&per_page=25" \
  -H "Authorization: Bearer nf_your_api_key_here"

响应格式

分页响应在 data 数组之外还包含一个 meta 对象:

json
{
  "data": [
    {
      "id": "clx1abc2d3e4f5g6h7i8j9k0",
      "title": "Customer Feedback",
      "status": "published",
      "created_at": "2026-01-15T09:30:00.000Z"
    },
    {
      "id": "clx2def3g4h5i6j7k8l9m0n1",
      "title": "Employee Survey",
      "status": "draft",
      "created_at": "2026-01-20T14:00:00.000Z"
    }
  ],
  "meta": {
    "page": 2,
    "per_page": 25,
    "total": 73,
    "total_pages": 3
  }
}

Meta 字段

字段类型描述
pageinteger当前页码。
per_pageinteger每页的项目数(实际应用的值)。
totalinteger所有页面的总项目数。
total_pagesinteger总页数(计算方式为 ceil(total / per_page))。

遍历所有页面

当您需要从列表端点获取每个项目时,逐页遍历直到 page 超过 total_pages

JavaScript

javascript
async function fetchAllForms() {
  const allForms = [];
  let page = 1;
  let totalPages = 1;

  do {
    const response = await fetch(
      `https://app.nueform.com/api/v1/forms?page=${page}&per_page=100`,
      {
        headers: {
          "Authorization": `Bearer ${process.env.NUEFORM_API_KEY}`,
        },
      }
    );

    const { data, meta } = await response.json();
    allForms.push(...data);
    totalPages = meta.total_pages;
    page++;
  } while (page <= totalPages);

  console.log(`Fetched ${allForms.length} forms in total.`);
  return allForms;
}

Python

python
import os
import requests

API_KEY = os.environ["NUEFORM_API_KEY"]
BASE_URL = "https://app.nueform.com/api/v1"

def fetch_all_forms():
    all_forms = []
    page = 1
    total_pages = 1

    while page <= total_pages:
        response = requests.get(
            f"{BASE_URL}/forms",
            headers={"Authorization": f"Bearer {API_KEY}"},
            params={"page": page, "per_page": 100},
        )
        body = response.json()
        all_forms.extend(body["data"])
        total_pages = body["meta"]["total_pages"]
        page += 1

    print(f"Fetched {len(all_forms)} forms in total.")
    return all_forms

异步生成器(JavaScript)

对于大型数据集,使用异步生成器在项目到达时逐个处理,而不是将所有内容加载到内存中:

javascript
async function* paginatedForms(perPage = 100) {
  let page = 1;
  let totalPages = 1;

  do {
    const response = await fetch(
      `https://app.nueform.com/api/v1/forms?page=${page}&per_page=${perPage}`,
      {
        headers: {
          "Authorization": `Bearer ${process.env.NUEFORM_API_KEY}`,
        },
      }
    );

    const { data, meta } = await response.json();
    totalPages = meta.total_pages;

    for (const form of data) {
      yield form;
    }

    page++;
  } while (page <= totalPages);
}

// 使用示例
for await (const form of paginatedForms()) {
  console.log(`Processing: ${form.title}`);
}

边界情况

空结果

如果没有匹配查询的项目,API 返回空的 data 数组,total0

json
{
  "data": [],
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 0,
    "total_pages": 0
  }
}

超出总页数

请求超出 total_pages 的页码会返回空的 data 数组。meta 值仍然反映整体集合:

json
{
  "data": [],
  "meta": {
    "page": 10,
    "per_page": 20,
    "total": 73,
    "total_pages": 4
  }
}

无效参数

无效的分页参数会被优雅处理:

输入行为
page=0page=-1默认为 1
page=abc默认为 1
per_page=0per_page=-5默认为 1
per_page=500限制为 100
per_page=abc默认为 20

最佳实践

批量获取时使用最大 per_page

获取所有资源时,设置 per_page=100 以减少 API 调用次数。每次调用都计入您的速率限制

迭代前检查 total_pages

始终从 meta 对象读取 total_pages 来确定何时停止。不要无限迭代或假设固定的页数。

大数据集在页面间添加延迟

如果您要获取许多页面,在请求之间添加一个小延迟以避免触发速率限制:

javascript
// 在页面请求之间添加 200 毫秒延迟
await new Promise((resolve) => setTimeout(resolve, 200));

适时缓存总数

如果您只需要总数(例如显示"47 个表单"),请求 per_page=1 并读取 meta.total 以最小化数据传输:

curl
curl -X GET "https://app.nueform.com/api/v1/forms?per_page=1" \
  -H "Authorization: Bearer nf_your_api_key_here"

分页结果反映的是每次请求时的数据状态。如果在页面请求之间创建或删除了项目,您可能会看到重复项或遗漏项。为了获得一致的快照,请快速获取所有页面或使用 Webhook 获取实时更新。

最后更新:2026年4月6日