【n8n教程】:HTTP Request节点分页完全指南——轻松处理大规模数据

在实际工作中,我们经常需要从API获取大量数据,但大多数API都会限制单次请求返回的数据量。这时就需要用到分页(Pagination)技术。

n8n 的 HTTP Request 节点是处理API请求最多才多艺的工具之一。它内置了强大的分页功能,让我们能够轻松地从任何支持REST API的服务获取数据——无需编写复杂代码。

本教程的目标:


核心概念

什么是API分页?

想象一家书店有1000本书,但书架每次只能展示50本。为了看完所有的书,你需要多次访问书架:

API分页的原理完全相同。 不同的API采用不同的方式告诉你"下一页"在哪里。

为什么需要分页?

  1. 1. 性能优化:避免一次性加载数百万条数据
  2. 2. 带宽控制:API服务器限制单次请求的数据量
  3. 3. 响应速度:减小网络传输的数据包大小
  4. 4. 用户体验:前端应用可以逐步显示数据

HTTP Request节点简介

什么是HTTP Request节点?

HTTP Request 节点是 n8n 中用于发送HTTP请求的核心节点。它支持:

如何添加HTTP Request节点

  1. 1. 打开 n8n 工作流编辑器
  2. 2. 点击画布上的 "+" 按钮
  3. 3. 搜索 "HTTP Request" 或在"通信"分类中找到
  4. 4. 点击节点名称将其添加到工作流

HTTP Request节点的基本结构

HTTP Request 节点的配置分为几个主要部分:

部分说明
Method选择 GET, POST, PUT, DELETE 等HTTP方法
URL输入要请求的API端点地址
Headers设置请求头信息
Query Parameters添加URL查询参数
Body发送请求体数据
Pagination配置分页设置

分页工作原理

API的三种分页实现方式

不同的API实现分页的方式不同,主要有三种:

1️⃣ 响应包含下一页URL (Response Contains Next URL)

API 在响应中返回指向下一页的完整URL

示例API响应:


    
    
    
  {
  "data"
: [
    {
"id": 1, "name": "Item 1"},
    {
"id": 2, "name": "Item 2"}
  ]
,
  "next-page"
: "https://api.example.com/items?page=2"
}

特点:

2️⃣ 通过页码参数分页 (Update Query Parameter)

API 支持通过页码参数(如 ?page=1)来指定要获取的页面。

示例API调用:


    
    
    
  第一页:https://api.example.com/items?page=1
第二页:https://api.example.com/items?page=2
第三页:https://api.example.com/items?page=3

特点:

3️⃣ 通过偏移量参数分页 (Update Body Parameter)

API 支持通过偏移量起始位置参数(如 offset, start 或在请求体中)来指定数据范围。

示例API调用:


    
    
    
  第一批:https://api.example.com/items?limit=50&offset=0
第二批:https://api.example.com/items?limit=50&offset=50
第三批:https://api.example.com/items?limit=50&offset=100

特点:

n8n 中的关键变量

在配置分页时,你会用到以下特殊变量:

变量说明示例
$pageCount已获取的页数(从0开始)第一次运行: 0, 第二次运行: 1
$response.body上次API请求的响应体{{ $response.body.next_page }}
$response.headers响应头信息{{ $response.headers['Link'] }}
$response.statusCodeHTTP状态码200, 404 等

三种分页模式详解

模式一:响应包含下一页URL

适用场景:

配置步骤:

  1. 1. 打开分页选项
    • • 在 HTTP Request 节点中
    • • 点击 "Add Option" > "Pagination"
  2. 2. 设置分页模式
    • • 选择 Pagination Mode"Response Contains Next URL"
    • • n8n 会显示相关配置字段
  3. 3. 指定下一页URL路径
    • • 在 "Next URL" 字段中输入表达式
    • • 示例:{{ $response.body["next-page"] }}
    • • 这里需要根据API返回的实际字段名调整

示例配置:


    
    
    
  Pagination Mode: Response Contains Next URL
Next URL: {{ $response.body.next_url }}
Pagination Complete When: {{ $response.body.next_url == undefined }}

工作原理:

  1. 1. 第1次请求:获取初始URL的数据
  2. 2. 从响应中提取 next_url 字段
  3. 3. 使用 next_url 发送第2次请求
  4. 4. 重复步骤2-3,直到 next_url 不存在

模式二:通过页码参数分页

适用场景:

配置步骤:

  1. 1. 打开分页选项
    • • 点击 "Add Option" > "Pagination"
  2. 2. 设置分页模式
    • • 选择 Pagination Mode"Update a Parameter in Each Request"
    • • 选择 Type"Query"(因为是URL查询参数)
  3. 3. 配置参数名称
    • Name: 输入参数名,通常是 page (根据API文档确定)
    • • 示例:page, page_number, pageNum
  4. 4. 配置参数值
    • • 点击 Value 字段,选择右侧的 "Expression" 按钮
    • • 输入表达式:{{ $pageCount + 1 }}
    • • 这是因为 $pageCount 从0开始,但大多数API的页码从1开始
  5. 5. (可选)设置页面大小
    • • 在主参数中勾选 "Send Query Parameters"
    • • 添加 limit_limit 参数,设置每页返回的数据条数

示例配置:


    
    
    
  Pagination Mode: Update a Parameter in Each Request
Type: Query
Name: page
Value: {{ $pageCount + 1 }}

额外参数:
Name: limit
Value: 25

工作原理:

  1. 1. 第1次请求:?page=1&limit=25($pageCount=0,加1后为1)
  2. 2. 获取数据,$pageCount自动变为1
  3. 3. 第2次请求:?page=2&limit=25($pageCount=1,加1后为2)
  4. 4. 重复直到API返回空数据或达到预设条件

模式三:通过请求体参数分页

适用场景:

配置步骤:

  1. 1. 打开分页选项
    • • 点击 "Add Option" > "Pagination"
  2. 2. 设置请求方法和分页模式
    • Method: 选择 "POST"(或你的API使用的方法)
    • Pagination Mode: 选择 "Update a Parameter in Each Request"
    • Type: 选择 "Body"(这是关键!)
  3. 3. 配置参数名称
    • Name: 输入参数名,通常是 page, offset, start
    • • 根据API文档确定实际的参数名
  4. 4. 配置参数值
    • • 点击 Value 字段,选择 "Expression"
    • • 输入表达式:{{ $pageCount + 1 }}

示例配置:


    
    
    
  HTTP Method: POST
Pagination Mode: Update a Parameter in Each Request
Type: Body
Name: page
Value: {{ $pageCount + 1 }}

工作原理:

  1. 1. 第1次请求:请求体中 page: 1
  2. 2. 获取数据后,自动更新为 page: 2
  3. 3. 发送第2次请求
  4. 4. 重复直到完成

实战案例

📌 实战案例:获取JSONPlaceholder的所有帖子并存储

让我们创建一个完整的工作流,从 JSONPlaceholder 这个免费的API获取所有帖子数据。

场景说明:

完整可执行工作流JSON:

将以下代码复制到 n8n 中导入:


    
    
    
  {
  "nodes"
: [
    {

      "parameters"
: {},
      "id"
: "82e269a3-867f-4dc1-8ee9-39d29e7b1234",
      "name"
: "When clicking 'Test Workflow'",
      "type"
: "n8n-nodes-base.manualTrigger",
      "typeVersion"
: 1,
      "position"
: [
        -460
,
        380

      ]

    }
,
    {

      "parameters"
: {
        "method"
: "GET",
        "url"
: "https://jsonplaceholder.typicode.com/posts",
        "options"
: {
          "pagination"
: {
            "enabled"
: true,
            "mode"
: "updateParameterInEachRequest",
            "type"
: "query",
            "property"
: "_start",
            "pageSize"
: 10
          }

        }
,
        "sendQuery"
: true,
        "queryParameters"
: {
          "parameters"
: [
            {

              "name"
: "_limit",
              "value"
: "10"
            }

          ]

        }

      }
,
      "id"
: "a1b2c3d4-e5f6-4g7h-8i9j-0k1l2m3n4o5p",
      "name"
: "HTTP Request - Get All Posts",
      "type"
: "n8n-nodes-base.httpRequest",
      "typeVersion"
: 4.2,
      "position"
: [
        -200
,
        380

      ]

    }
,
    {

      "parameters"
: {
        "mode"
: "jsonToPrettyJson"
      }
,
      "id"
: "b2c3d4e5-f6g7-4h8i-9j0k-1l2m3n4o5p6q",
      "name"
: "Format Output",
      "type"
: "n8n-nodes-base.code",
      "typeVersion"
: 2,
      "position"
: [
        0
,
        380

      ]

    }

  ]
,
  "connections"
: {
    "When clicking 'Test Workflow'"
: {
      "main"
: [
        [

          {

            "node"
: "HTTP Request - Get All Posts",
            "branch"
: 0,
            "in"
: 0
          }

        ]

      ]

    }
,
    "HTTP Request - Get All Posts"
: {
      "main"
: [
        [

          {

            "node"
: "Format Output",
            "branch"
: 0,
            "in"
: 0
          }

        ]

      ]

    }

  }
,
  "active"
: false,
  "settings"
: {
    "executionOrder"
: "v1"
  }
,
  "versionId"
: "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
  "meta"
: {
    "instanceOwner"
: null
  }
,
  "pinData"
: {}
}

导入步骤:

  1. 1. 复制上面的JSON代码
  2. 2. 打开n8n,在工作流编辑器中
  3. 3. 点击顶部菜单的 "..." 按钮
  4. 4. 选择 "Import from File""Import from JSON"
  5. 5. 粘贴上面的代码并导入
  6. 6. 点击 "Test Workflow" 按钮运行

工作流说明:


    
    
    
  手动触发 → HTTP Request(分页获取) → 格式化输出

节点配置详解:

第1个节点:手动触发

第2个节点:HTTP Request - 获取所有帖子

第3个节点:格式化输出

📊 工作流执行过程

执行步骤:

  1. 1. 第1次请求($pageCount=0)
    
        
        
        
      GET https://jsonplaceholder.typicode.com/posts?_start=0&_limit=10

    返回:帖子1-10

  2. 2. 第2次请求($pageCount=1)
    
        
        
        
      GET https://jsonplaceholder.typicode.com/posts?_start=10&_limit=10

    返回:帖子11-20

  3. 3. 第3次请求($pageCount=2)
    
        
        
        
      GET https://jsonplaceholder.typicode.com/posts?_start=20&_limit=10

    返回:帖子21-30

...以此类推,直到获取完所有100条帖子。

💡 常见自定义场景

场景A:使用传统的 page 参数

如果API使用 page 参数而不是 _start:


    
    
    
  配置改为:
Property: page
Value Expression: {{ $pageCount + 1 }}

场景B:在请求体中传递分页参数


    
    
    
  Method: POST
Body Type: JSON
Pagination Type: Body
Property: page
Value Expression: {{ $pageCount + 1 }}

场景C:处理响应包含下一页URL的情况


    
    
    
  Pagination Mode: Response Contains Next URL
Next URL: {{ $response.body.next_url }}
Pagination Complete When: {{ $response.body.next_url == undefined }}

常见问题

Q1: 如何知道API支持哪种分页方式?

A: 查看API文档是第一步:

  1. 1. 搜索 API 文档中的"Pagination"或"分页"部分
  2. 2. 查看示例请求的URL格式
  3. 3. 检查返回的响应数据结构中是否包含下一页信息

快速判断方法:

Q2: 工作流一直在重复,怎样才能停止分页?

A: n8n 会自动检测以下情况来停止分页:

  1. 1. 响应为空 - API返回空数组或null
  2. 2. 已指定完成条件 - 通过表达式判断
  3. 3. 达到最大页数 - 使用 Loop 节点配合

手动设置完成条件的方法:

在 HTTP Request 节点的分页选项中,设置 "Pagination Complete When":


    
    
    
  {{ $response.body.items.length === 0 }}


    
    
    
  {{ $response.body.cursor === undefined }}

Q3: 如何在分页时添加延迟,避免API限流?

A: 使用 Wait 节点:

  1. 1. 在 HTTP Request 节点后添加一个 Wait 节点
  2. 2. 设置等待时间(如 1秒)
  3. 3. 这样每次分页请求之间都会等待指定时间

    
    
    
  HTTP Request → Wait (1秒) → 继续下一个操作

Q4: 分页过程中出现错误怎么办?

A: 使用 错误处理重试 机制:

  1. 1. 在节点配置中启用 "Continue on Error"
  2. 2. 或者在节点后添加 Error Trigger 处理错误

Q5: 如何判断分页是否成功完成?

A: 查看以下信息:

  1. 1. 执行日志 - 查看每次请求的响应
  2. 2. 节点输出 - 检查输出面板中的数据
  3. 3. 数据统计 - 使用 Code 节点计算总数据条数

进阶技巧

技巧1:结合 Loop 节点处理大数据集

当需要对每条数据进行后续处理时,使用 Loop 节点:


    
    
    
  HTTP Request (分页获取) → Loop Over Items → 数据处理

技巧2:限制最大页数

使用 Loop 节点的配置来限制分页次数,避免无意中获取过多数据:


    
    
    
  Loop Until: $pageCount >= 5

技巧3:监控API速率限制

许多API的速率限制信息在响应头中:


    
    
    
  在 HTTP Request 节点中启用:
Include Response Headers and Status = true

然后通过表达式访问:
{{ $response.headers['x-ratelimit-remaining'] }}

技巧4:组合多个API请求

在一个工作流中结合多个 HTTP Request 节点,实现复杂的数据集成:


    
    
    
  API 1 (分页) → 数据转换 → API 2 (分页) → 合并结果

总结

分页的三种模式:

  1. 1. 响应包含下一页URL
  2. 2. 通过页码参数
  3. 3. 通过请求体参数

关键变量:

最佳实践:

常用表达式:


    
    
    
  页码模式: {{ $pageCount + 1 }}
URL响应模式: {{ $response.body.next_url }}
偏移量模式: {{ $pageCount * 10 }}

资源链接

引用链接

[1] 官方文档: https://docs.n8n.io/code/cookbook/http-node/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#