在实际工作中,我们经常需要从API获取大量数据,但大多数API都会限制单次请求返回的数据量。这时就需要用到分页(Pagination)技术。
n8n 的 HTTP Request 节点是处理API请求最多才多艺的工具之一。它内置了强大的分页功能,让我们能够轻松地从任何支持REST API的服务获取数据——无需编写复杂代码。
本教程的目标:
想象一家书店有1000本书,但书架每次只能展示50本。为了看完所有的书,你需要多次访问书架:
API分页的原理完全相同。 不同的API采用不同的方式告诉你"下一页"在哪里。
HTTP Request 节点是 n8n 中用于发送HTTP请求的核心节点。它支持:
HTTP Request 节点的配置分为几个主要部分:
| 部分 | 说明 |
|---|---|
| Method | 选择 GET, POST, PUT, DELETE 等HTTP方法 |
| URL | 输入要请求的API端点地址 |
| Headers | 设置请求头信息 |
| Query Parameters | 添加URL查询参数 |
| Body | 发送请求体数据 |
| Pagination | 配置分页设置 |
不同的API实现分页的方式不同,主要有三种:
API 在响应中返回指向下一页的完整URL。
示例API响应:
{
"data": [
{"id": 1, "name": "Item 1"},
{"id": 2, "name": "Item 2"}
],
"next-page": "https://api.example.com/items?page=2"
}特点:
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特点:
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特点:
在配置分页时,你会用到以下特殊变量:
| 变量 | 说明 | 示例 |
|---|---|---|
$pageCount | 已获取的页数(从0开始) | 第一次运行: 0, 第二次运行: 1 |
$response.body | 上次API请求的响应体 | {{ $response.body.next_page }} |
$response.headers | 响应头信息 | {{ $response.headers['Link'] }} |
$response.statusCode | HTTP状态码 | 200, 404 等 |
适用场景:
next_url, next_page, link 等字段配置步骤:
{{ $response.body["next-page"] }}示例配置:
Pagination Mode: Response Contains Next URL
Next URL: {{ $response.body.next_url }}
Pagination Complete When: {{ $response.body.next_url == undefined }}工作原理:
next_url 字段next_url 发送第2次请求next_url 不存在适用场景:
?page=1, ?page=2 格式配置步骤:
page (根据API文档确定)page, page_number, pageNum 等{{ $pageCount + 1 }}$pageCount 从0开始,但大多数API的页码从1开始limit 或 _limit 参数,设置每页返回的数据条数示例配置:
Pagination Mode: Update a Parameter in Each Request
Type: Query
Name: page
Value: {{ $pageCount + 1 }}
额外参数:
Name: limit
Value: 25工作原理:
?page=1&limit=25($pageCount=0,加1后为1)?page=2&limit=25($pageCount=1,加1后为2)适用场景:
配置步骤:
page, offset, start 等{{ $pageCount + 1 }}示例配置:
HTTP Method: POST
Pagination Mode: Update a Parameter in Each Request
Type: Body
Name: page
Value: {{ $pageCount + 1 }}工作原理:
page: 1page: 2让我们创建一个完整的工作流,从 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": {}
}导入步骤:
工作流说明:
手动触发 → HTTP Request(分页获取) → 格式化输出节点配置详解:
第1个节点:手动触发
第2个节点:HTTP Request - 获取所有帖子
https://jsonplaceholder.typicode.com/postsupdateParameterInEachRequestquery_start (JSONPlaceholder使用_start作为偏移量参数)10 (每页10条数据)_limit=10 (限制每次返回10条数据)第3个节点:格式化输出
执行步骤:
GET https://jsonplaceholder.typicode.com/posts?_start=0&_limit=10返回:帖子1-10
GET https://jsonplaceholder.typicode.com/posts?_start=10&_limit=10返回:帖子11-20
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 }}A: 查看API文档是第一步:
快速判断方法:
page=1, offset=0 → 使用页码/偏移量参数next_url, next_page → 使用响应URL模式A: n8n 会自动检测以下情况来停止分页:
手动设置完成条件的方法:
在 HTTP Request 节点的分页选项中,设置 "Pagination Complete When":
{{ $response.body.items.length === 0 }}或
{{ $response.body.cursor === undefined }}A: 使用 Wait 节点:
HTTP Request → Wait (1秒) → 继续下一个操作A: 使用 错误处理 和 重试 机制:
A: 查看以下信息:
当需要对每条数据进行后续处理时,使用 Loop 节点:
HTTP Request (分页获取) → Loop Over Items → 数据处理使用 Loop 节点的配置来限制分页次数,避免无意中获取过多数据:
Loop Until: $pageCount >= 5许多API的速率限制信息在响应头中:
在 HTTP Request 节点中启用:
Include Response Headers and Status = true
然后通过表达式访问:
{{ $response.headers['x-ratelimit-remaining'] }}在一个工作流中结合多个 HTTP Request 节点,实现复杂的数据集成:
API 1 (分页) → 数据转换 → API 2 (分页) → 合并结果✅ 分页的三种模式:
✅ 关键变量:
$pageCount - 已获取页数$response.body - 响应体$pageCount + 1 - 计算下一页号✅ 最佳实践:
✅ 常用表达式:
页码模式: {{ $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#