【问题标题】:Postman API - setNextRequest not setting next requestPostman API - setNextRequest 未设置下一个请求
【发布时间】:2019-11-21 14:36:56
【问题描述】:

我有一个获取作业状态的 API。 它解析响应正文并查找作业的“状态:”。

如果它是 INPROGRESS 我告诉请求等待 10 秒并重新运行,但这不会发生,它只是继续下一个。

这是我正在运行的测试:

pm.environment.unset("JobStatus");
var jsonData = pm.response.json();
pm.environment.set("JobStatus", jsonData['progress-update'].state);

const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
};

pm.environment.get("JobStatus");

if (    environment.JobStatus == "DONE") 
{
  postman.setNextRequest("Export Results");
}
else if (    environment.JobStatus == "INPROGRESS")
{
  sleep(10000).then(() => {
  postman.setNextRequest("Get Job Status");
})}
else {
  postman.setNextRequest(null);
}

数据有一个我正在检查的主任务,然后是许多具有相同状态 INPROGRESS 字符串的子任务。

{
    "progress-update": {
        "@type": "parallel-progress",
        "job": {
            "@href": "/api/space/job-management/jobs/4755716"
        },
        "taskId": 4755716,
        "jobName": "Compare Config-4755716",
        "state": "INPROGRESS",
        "status": "UNDETERMINED",
        "percentage": 10,
        "subTask": [
            {
                "@type": "percentage-complete",
                "state": "INPROGRESS",
                "status": "UNDETERMINED",
                "percentage": 0
            },

变量设置正确,但没有遵循我的 else if 语句。

编辑:

我更改了逻辑以在请求 4 的测试中设置变量,并对 Pre-Script Request 5 进行检查。 这应该将收集运行器发送回请求 4,直到 JobStatus == "DONE" 但事实并非如此。

我添加了一些额外的代码来帮助我从控制台查看它的执行情况:

    const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
};

pm.environment.get("JobStatus");

if (    environment.JobStatus === "DONE") 
{
  postman.setNextRequest("Export Results");
  console.log("DONE")
  console.log(environment.JobStatus)
}
else if (    environment.JobStatus === "INPROGRESS")
{
  sleep(10000).then(() => {
  postman.setNextRequest("Get Job Status");
  console.log("INPROGRESS")
  console.log(environment.JobStatus)
})}
else {
  postman.setNextRequest(null);
  console.log("ELSE")
  console.log(environment.JobStatus)
}

当这个被执行时,我得到了

INPROGRESS

INPROGRESS

在控制台中打印。它只是完成了请求,而没有将自己发送回请求 4 重试。

为什么遵循 else if 逻辑却忽略了 setNextRequest?

【问题讨论】:

  • ................

标签: javascript api if-statement variables postman


【解决方案1】:

您尝试做的最好使用收集运行器和setNextRequest 来完成。我花了好几个小时试图以同样的方式完成同样的事情,但一无所获。这是你最好的选择:

https://learning.getpostman.com/docs/postman/scripts/branching-and-looping/

不幸的是,这仅适用于集合运行器,但其想法是在一个请求中您执行所有 if 语句并根据逻辑您将 setNextRequest("same_request")setNextRequest(null)

【讨论】:

  • 这正是我正在做的事情,我的代码已经包含这些命令,并且正在从集合运行器中使用它们。我只是对为什么我的逻辑不起作用感到困惑。 JobStatus = INPROGRESS 所以它应该等待 10 秒,然后再次检查 JobStatus,直到它完成或其他。相反,它只是继续下一项工作,就好像它“完成”一样。
  • 我自己之前遇到过sleep 的问题,但我不记得它周围的问题,我相信它与异步调用有关。无论如何,最终对我有用的是使用 Postman 的“睡眠”端点:“postman-echo.com/delay/5
【解决方案2】:

对于那些可能遇到此问题的人,我发现了问题,或者说是两个问题。

我的 environment.JobStatus 变量没有被设置,我不知道如何设置它。所以我放弃了环境变量,只是在 JS 中声明了它。

其次,我的 postman.setNextRequest("Get Job Status") 被忽略了,因为它嵌套在 sleep 函数中。不知道为什么会导致它,但我把它从睡眠中掉了出来,现在它循环得很好。

var jsonData = pm.response.json();
var jobState = jsonData['progress-update'].state

const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds));
};


if (    jobState === "DONE") 
{
  console.log(jobState);
}
else if (    jobState === "INPROGRESS")
{
  sleep(10000).then(() => {
  console.log(jobState);
})
    postman.setNextRequest("Get Job Status");
}
else {
  console.log("ELSE Clause was matched.");
  console.log(jobState);
  postman.setNextRequest(null);
}

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 2023-02-10
    • 2022-07-04
    • 2022-09-23
    • 2018-11-15
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多