4

在我的 Postman Mock Server 中,我设置了一个返回 JSON 的 GET 请求,其中返回以下内容

“due_date":"2021-10-10"

我想要的是调整响应,以便返回的日期是过去两天。所以如果今天是“2021-10-10”,我希望回复包含

“due_date":"2021-10-08”

如果今天是“2022-01-01”,我希望回复包含

“due_date":"2021-12-30”

等等。如何设置我的 Postman 模拟服务器请求以返回此类数据?

4

2 回答 2

0

我认为这是一个很好的问题,除了我很好奇,所以我做了一些研究并找到了解决方法。这有点复杂。我不确定是否值得。

首先,Postman Mock Server(简称 Mock Server)无法执行任何测试和预脚本,因此它无法计算事物。你需要在这里计算,你要怎么做?好吧,您可以定义一个environmentfor Mock Server,它使您能够在模拟响应中使用动态值。

我将继续一步一步地展示这个过程。

1 - 打开一个带有环境的模拟服务器:

1.1 - 为新的 Mock Server 创建一个集合:

创建模拟服务器 1

您的模拟响应将如下所示:

{"due_date": "{{date}}"}

1.2 - 创建环境:

创建模拟服务器 2

1.3 - 完成创建:

创建模拟服务器 3

1.4 - 完成后,Postman 会创建一个如下所示的集合:

创建模拟服务器 4

1.5 - 你可以从这个集合中测试你的模拟服务器:

创建模拟服务器 5

如您所见,Mock Server 在其响应中使用环境变量。

现在,我们必须弄清楚如何更新环境变量。

您必须使用外部服务来更新您的环境变量。您可以将 Postman Monitor 用于此作业,因为它可以执行测试(意味着任何代码)并且像 CRON 作业一样工作,这意味着您可以将 Postman Monitor 设置为每 24 小时更新一次特定的环境变量。

2 - 打开 Postman Monitor 以更新您的环境:

2.1 - 这一步非常简单,创建一个 Postman Monitor 如下配置:

创建邮递员监视器 1

2.2 - 编写测试以更新环境:

创建邮递员监视器 2

测试将如下所示:

// you have to use pm.test() otherwise Postman Monitor not execute the test
const moment = require("moment");

pm.test("update date", () => {
  // set date 2 days past
  let startdate = moment();
  const dayCount = 2;
  startdate = startdate.subtract(dayCount, "days");
  startdate = startdate.format("YYYY-MM-DD");

  // this is not work on Postman Monitor, use Postman API like below
  //pm.environment.set('date', startdate);

  const data = JSON.stringify({
    environment: {
      values: [
        {
          key: "date",
          value: startdate,
        },
      ],
    },
  });

  const environmentID = "<your-environment-id>";

  // Set environment variable with Postman API
  const postRequest = {
    url: `https://api.getpostman.com/environments/${environmentID}`,
    method: "PUT",
    header: {
      "Content-Type": "application/json",
      "X-API-Key":
        "<your-postman-api-key>",
    },
    body: {
      mode: "raw",
      raw: data,
    },
  };

  pm.sendRequest(postRequest, (error, response) => {
    console.log(error ? error : response.json());

    // force to fail test if any error occours
    if (error) pm.expect(true).to.equal(false);
  });
});

pm.environment使用 Postman Monitor 时无法更改环境变量。您应该在测试中使用 Postman API pm.sendRequest

您需要获取 Postman API 密钥并且需要了解您的环境 ID。您可以从 Postman API 中了解环境 id。

要了解您的环境 ID,请使用此端点:https ://www.postman.com/postman/workspace/postman-public-workspace/request/12959542-b7ace502-4a5a-4f1c-8164-158811bbf236

要了解如何获取 Postman API 密钥:https ://learning.postman.com/docs/developer/intro-api/#generating-a-postman-api-key

2.3 - 手动运行 Postman Monitor 以确保测试正常工作:

创建邮递员监视器 3

2.4 - 如您所见,Postman Monitor 执行脚本:

创建邮递员监视器 4

2.5 - 当我检查环境时,我可以看到结果:

创建邮递员监视器 5

您可以从浏览器测试以查看结果:

创建邮递员监视器 6

于 2021-10-13T08:11:44.647 回答
0

我之前已经回答了这个问题,但我有另一个解决方案。

您可以部署服务器以更新模拟环境中的变量。如果您想免费使用,只需使用Heroku即可。

我用 Python 编写了一个 Flask 应用程序并将其部署到 Heroku,检查以下代码:

from flask import Flask
import os
import json
import requests
from datetime import datetime, timedelta

app = Flask(__name__)

# the port randomly assigned and then mapped to port 80 by the Heroku
port = int(os.environ.get("PORT", 5000))

# debug mode
debug = False


@app.route('/')
def hello_world():
    N_DAYS_AGO = 2

    # calculate date
    today = datetime.now()
    n_days_ago = today - timedelta(days=N_DAYS_AGO)
    n_days_ago_formatted = n_days_ago.strftime("%Y-%m-%d")

    # set environment
    payload = json.dumps({
        "environment": {
            "values": [
                {
                    "key": "occupation",
                    "value": n_days_ago_formatted
                }
            ]
        }
    })

    postman_api_key = "<your-postman-api-key>"

    headers = {
        'Content-Type': 'application/json',
        'X-API-Key': postman_api_key
    }

    environment_id = "<your-environment-id>"
    url = "https://api.getpostman.com/environments/" + environment_id

    r = requests.put(url, data=payload, headers=headers)

    # return postman response
    return r.content


if __name__ == '__main__':
    app.run(debug=debug, host='0.0.0.0', port=port)

代码计算新日期并将其发送到模拟环境。它有效,我在这个答案之前在 Heroku 中测试了它。

当您转到 Heroku 应用程序的页面时,代码将触发并且date环境将自动更新,请使用模拟服务器中的环境变量来解决问题。

您需要自动执行此代码,因此我建议您使用UptimeRobot每天 1 次 ping 您的 Heroku 应用程序。在每次 ping 时,您的环境变量都会更新。不要过度使用它,因为 Heroku 有免费计划的使用配额。

要使用此代码,您需要学习如何在 Heroku 上部署 Flask 应用程序。顺便说一句,Flask 在这里只是一个选项,您可以使用 NodeJS 代替 Python,逻辑将保持不变。

于 2021-10-21T21:25:52.613 回答