使用邮递员在分页响应中获取所有页面

时间:2018-12-13 13:02:06

标签: postman

{
"users": [...],
"next_page": "https://junk.example.com/api/v2/users.json?page=2",
"previous_page": null,
"count": 1091
} 

上面的示例是我在响应正文中收到的。我正在尝试使邮递员自动拉动每个页面。我已经在邮递员中看到了有关条件工作流的文档,但是我似乎无法使其正常工作。我使用了this post made last year.中的示例示例,但是该示例似乎与我的情况不太吻合。请参见下面的尝试的测试代码。

try {
    var jsonData = pm.response.json();
  //var jsonData = JSON.parse(responseBody);

  //The above commented code is my attempt to alter the original example 
  //in the hopes of a solution.

  postman.setNextRequest(jsonData.next_page);

} catch (e) {
  console.log('Error parsing JSON', e);
  postman.setNextRequest(null);
}

您可能已经看到尝试修改它,以查看采用另一种提取next_page对象的方法是否可以解决问题,但到目前为止还算不上成功。我没有收到任何错误,当我尝试执行收集运行时,get请求根本不会运行下一页。

2 个答案:

答案 0 :(得分:1)

问题在于postman.setNextRequest()的工作原理略有不同:在执行收集运行器期间,它根据集合中的请求名称设置下一个请求。在这种情况下,您将提供要遵循的实际URL,而不是在集合中提供下一个请求的名称。

发送此类请求的最简单方法是在您的集合中添加新请求(可以将其命名为'NextRequest',并提供环境变量{{nextRequestUrl}}作为URL。

在您的第一个请求中,您可以执行以下代码将下一页的实际URL添加到环境变量中

const jsonData = pm.response.json();

if(jsonData.next_page != null){
    pm.environment.set('nextRequestUrl', jsonData.next_page)
    postman.setNextRequest('NextRequest');
} else {
    postman.setNextRequest(null);
}

'NextRequest'请求中,您可以在“测试”标签上添加相同的脚本。

答案 1 :(得分:1)

您可以在“预请求脚本”或“测试”选项卡上使用pm.sendRequest。在下面的示例中,我将“测试”选项卡放入。使用“显示邮递员控制台”查看结果:

# Recursive function that will call all of the pages
function callMyRequest(nextUrl) {
    pm.sendRequest({
        url: nextUrl,
        method: 'GET'
    }, function (err, res) {
        if (err) {
            console.log(err)
        } else {
            # Basic tests about the response (res)
            pm.test("Response code is 200", function() {
                pm.expect(res).to.have.property('code', 200);
            });

            pm.test("Response status is OK", function() {
                pm.expect(res).to.have.property('status', 'OK');
            });

            pm.test("Response Body is not empty", function () {
                pm.expect(res.json()).to.not.be.empty;
            });

            # Check for the next page
            if (res.json().next_page !== null) {
                callMyRequest(res.json().next_page);
            } else {
                # Stop iterations
                postman.setNextRequest(null);
            }
        }
    });
}

# Basic tests about the main response (pm.response)
pm.test("Response code is 200", function() {
    pm.expect(pm.response).to.have.property('code', 200);
});

pm.test("Response status is OK", function() {
    pm.expect(pm.response).to.have.property('status', 'OK');
});

pm.test("Response Body is not empty", function () {
    pm.expect(pm.response.json()).to.not.be.empty;
});

# We need to check if there is pagination   
if (pm.response.json().next_page !== null) {
    callMyRequest(pm.response.json().next_page);
} else {
    postman.setNextRequest(null);
}