如何在Postman中基于上一请求响应构建异步轮询工作流?
无需修改服务器响应,Postman即可实现异步请求自动轮询
完全可以直接借助Postman的测试脚本实现需求,不用单独提取job-id字段,也不用修改服务器返回内容,具体实现如下:
1. 给初始异步请求添加测试脚本
在返回202状态码的那个请求的「Tests」标签页中,粘贴以下脚本:
// 仅在返回202时触发轮询逻辑 if (pm.response.code === 202) { // 从响应头中获取轮询地址和重试间隔 const pollingUrl = pm.response.headers.get('location'); const retrySeconds = parseInt(pm.response.headers.get('retry-after')) || 5; // 若retry-after缺失,默认5秒重试 // 保存关键参数到环境变量(可选,方便后续调试) pm.environment.set('pollingUrl', pollingUrl); pm.environment.set('retryInterval', retrySeconds); // 定义轮询函数 const pollJobStatus = () => { pm.sendRequest({ url: pollingUrl, method: 'GET', // 直接复用当前请求的所有认证信息(OAuth、API Key、Basic Auth等) auth: pm.request.auth, // 排除Host头避免重复设置导致的错误 header: pm.request.headers.filter(h => h.key.toLowerCase() !== 'host') }, (err, response) => { if (err) { console.error('轮询失败:', err.message); return; } if (response.code === 200) { // 任务完成,可将结果保存到环境变量供后续使用 console.log('异步任务执行完成:', response.json()); pm.environment.set('jobFinalResult', JSON.stringify(response.json())); } else { // 未完成,按照retry-after间隔继续轮询 setTimeout(pollJobStatus, retrySeconds * 1000); } }); }; // 首次延迟后启动轮询 setTimeout(pollJobStatus, retrySeconds * 1000); }
2. 核心特性说明
- 自动复用凭证:通过
pm.request.auth直接继承初始请求的认证配置,不用再为轮询请求单独设置权限 - 遵循服务器重试规则:严格按照
retry-after头指定的间隔发起轮询,避免无效请求 - 灵活终止条件:当前以返回200作为轮询终止标志,你可以额外添加轮询次数上限(比如加个计数器,超过15次就停止)
3. 可选:集合运行器可视化方案
如果需要更直观的流程管理,也可以把流程拆成两个请求放在集合里:
- 发起异步任务请求:在Tests中把
location和retry-after存入环境变量 - 轮询状态请求:URL填写
{{pollingUrl}},在「Pre-request Script」中添加延迟:
然后在Tests中判断响应码,若不是200,就设置集合运行器继续迭代该请求(需在集合运行器中开启迭代并设置足够的次数)const interval = pm.environment.get('retryInterval') || 5; pm.request.delay(interval * 1000);
内容的提问来源于stack exchange,提问作者benjamingranados
相关产品推荐
相关产品推荐

