我正在使用Postman测试API,我遇到了一个问题:我的请求是中间件,所以要么我收到一个完整的1000+行JSON,要么我收到PENDING状态和空数组结果:
{
"meta": {
"status": "PENDING",
"missing_connectors_count": 0,
"xxx_type": "INTERNATIONAL"
},
"results": []
}
问题是,如何在Postman中循环此请求,直到我获得状态SUCCESS并且结果数组> 0?当我一个接一个地手动发送这些请求时,没关系,但是当我通过Collection Runner运行它们时,“PENDING”会弄乱一切。
试试这个:
var body = JSON.parse(responseBody);
if (body.meta.status !== "SUCCESS" && body.results.length === 0){
postman.setNextRequest("This_same_request_title");
} else {
postman.setNextRequest("Next_request_title");
/* you can also try postman.setNextRequest(null); */
}
在等待服务准备就绪或轮询长时间运行的作业结果时,我看到4个基本选项:
https://postman-echo.com/delay/10
,其中最后一个URI元素是等待的秒数。这简单而简洁,可以在长时间运行请求后作为单个步骤插入。挑战在于如果请求持续时间变化很大,您可能会因为没有等待足够长的时间而得到错误的失败。postman.setNextRequest(request.name);
成功。这里面临的挑战是Postman将尽可能快地执行请求,这可能会使您的服务失败,让您黑名单(并导致错误的失败),并且如果在公共构建服务器上运行则会咀嚼大量CPU - 减慢其他建立。注意:这些有一些细微的变化 - 比如在集合,集合文件夹,步骤等上设置它们。
我喜欢选项4,因为它为我的大多数情况提供了正确的粒度级别。请注意,这似乎是Postman脚本中“睡眠”的唯一方法。现在不支持像带有异步和等待的Promise这样的标准javascript睡眠方法,并且使用沙箱的lodash _.delay(function() {}, delay, args[...])
不会在预请求脚本上保留脚本执行。
在Postman独立应用程序v6.0.10中,将步骤预请求脚本设置为:
console.log('Waiting for job completion in step "' + request.name + '"');
// Construct our request URL from environment variables
var url = request['url'].replace('{{host}}', postman.getEnvironmentVariable('host'));
var retryDelay = 1000;
var retryLimit = 3;
function isProcessingComplete(retryCount) {
pm.sendRequest(url, function (err, response) {
if(err) {
// hmmm. Should I keep trying or fail this run? Just log it for now.
console.log(err);
} else {
// I could also check for response.json().results.length > 0, but that
// would omit SUCCESS with empty results which may be valid
if(response.json().meta.status !== 'SUCCESS') {
if (retryCount < retryLimit) {
console.log('Job is still PENDING. Retrying in ' + retryDelay + 'ms');
setTimeout(function() {
isProcessingComplete(++retryCount);
}, retryDelay);
} else {
console.log('Retry limit reached, giving up.');
postman.setNextRequest(null);
}
}
}
});
}
isProcessingComplete(1);
您可以在同一步骤中进行标准测试。
注意:标准警告适用于使retryLimit变大。
当我正在阅读你的问题时,我正在寻找同一个问题的答案并想到了一个可能的解决方案。每当您没有得到您正在寻找的响应时,请使用邮递员工作流程重新运行您的请求。无论如何,这就是我要尝试的。
postman.setNextRequest("request_name");