了解示例匹配

使用 Postman 模拟服务需要以下条件:包含请求的集合、模拟服务器和已保存的请求示例。您可以根据需要将尽可能多的示例保存到集合中,并且模拟服务器会以可预测的方式返回这些示例。但是,mock 究竟是如何决定返回哪个示例的呢?

模拟的匹配算法

首先,让我们从一个例子开始。

创建模拟图

当使用 Postman API 或 Postman 应用程序创建模拟时,将调用 Postman 服务器,将特定集合(和环境,如果您选择一个)与新创建的模拟相关联。刚刚模拟的集合C1现在与新的模拟相关联M1

显示模拟图

当您M1通过 Postman 应用程序中的模拟 URL使用模拟https://M1.mock.pstmn.io时,模拟服务将在开始匹配过程之前从 Postman 服务器检索该特定集合的所有已保存示例。

使用模拟图

现在模拟服务已经保存了当前集合的所有示例,它现在将迭代地将传入请求与最接近的匹配示例配对。

传入的请求可以有几个可配置的变量,例如requestMethodmockPath。该requestMethod变量对应于任何有效的 HTTP 请求方法(例如GET, POST, PUT, PATCH, DELETE, 等),而mockPath指的是任何有效的字符串路径(例如/, /test, /test/path, /test/path/1)。

其他可选标头,例如x-mock-response-namex-mock-response-id允许您进一步指定要分别由名称或已保存示例的 UID 返回的示例。您可以通过使用 Postman API获取单个集合并在响应中搜索您的示例来获取示例响应 UID 。UID 具有语法<user_id>-<response_id>

模拟可配置

牢记这些不同的可配置元素,让我们看一下匹配算法逻辑。

  1. 格式正确的响应

    任何不符合预期格式的响应都会从匹配过程中删除。

  2. HTTP方法

    任何不是相同 HTTP 方法类型的响应都将从匹配过程中删除。例如:如果您发送的模拟请求是POSTto https://M1.mock.pstmn.io/test,则所有保存的方法类型不是的示例都POST将被忽略。

  3. 按 URL 过滤

    匹配过程现在将检查每个保存的示例,并遍历所有可能性。将mockPath输入 URL 的 与保存的示例的 URL 进行比较。如果输入 URL 是https://M1.mock.pstmn.io/test并且当前正在检查的示例的 URL 是https://google.com/help,则模拟服务将/test与进行比较/help。在比较 URL 时,会进行逐步匹配。匹配算法遍历的每个连续步骤都会降低当前示例响应的匹配阈值。

    例如:

    • 尝试将输入路径与示例路径完全匹配。最大值设置为匹配阈值。
    • 尝试去除尾部斜杠并将输入路径与示例路径匹配。阈值降低了某个值,n
    • 尝试另外小写输入路径和示例路径 阈值减小一个更大的值,n + m
    • 尝试另外从输入路径和示例路径中去除字母数字 ID。阈值进一步降低,n + 2m
    • 如果所有步骤都失败,则此保存的示例不是合格的响应。
    • 匹配 URL 时也会考虑参数(例如{{url}}/path?status=pass),这些参数可用于确定要显示的示例。
  4. 通配符

    示例请求中所有未解析的变量(不存在于模拟服务器的关联环境中)都被视为通配符变量。通配符变量充当动态 URL 段的捕获组。如果 API 的 URL 的某些部分映射到资源标识符(如用户 ID、用户名或文件名),您会发现这很有用。

    例如,假设您正在模拟一个按 ID 返回用户配置文件的端点。它从 URL 中获取用户 ID,并在响应中返回用户 ID。因此,在调用GET {{url}}/users/{{userId}}时,端点应该返回:

    {
      "id": 2,
      "name": "Carol"
    }

    要在模拟中匹配这样的请求,您现在可以在示例的请求 URL 中使用变量。您不需要在示例中对值进行硬编码。相反,您可以匹配发送到模拟服务器的任何与模式匹配的请求GET /users/<userId>。您只需要替换动态段

    通配符匹配仅适用于整个 URL 路径段。所以,同样的例子,GET {{url}}/users/{{userId}}可以服务GET /users/1GET /users/100甚至GET /users/carol。但是,它不会匹配GET /users/foo/bar

    您可以在示例的响应中使用相同的变量来使用它们捕获的值。以相同的示例,您可以为相同的示例添加请求正文,如下所示:

    {
      "id": {{userId}},
      "name": "Carol"
    }

    这将从具有相同变量名称的通配符段捕获的值传递到响应中。

    响应正文中的通配符不是匹配算法的一部分。

  5. 响应代码

    如果x-mock-response-code明确提供了标头,则过滤掉所有没有匹配响应代码的示例。

  6. 最高阈值

    将剩余的过滤响应按降序排序,并返回具有最高阈值的响应。

这就是模拟服务如何找到并返回对模拟请求的适当响应的方式。