跳到主要内容

示例匹配

使用 Postman 的 模拟服务器 需要一个包含请求和保存的请求示例的集合。你可以根据需要将任意数量的示例保存到集合中,模拟服务器将可预测地返回这些示例。Postman 使用匹配算法来决定返回哪些示例。

模拟服务器元素

当你创建一个模拟服务器时,Postman 将一个特定的集合(和一个可选的环境)与新的模拟服务器相关联。在下面的场景中,集合C1与新的模拟服务器相关联M1

创建模拟图

当你M1使用模拟服务器 URL 调用模拟服务器时https://M1.mock.pstmn.io,模拟服务会在开始匹配过程之前检索关联集合的所有已保存示例。

显示模拟图

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

使用模拟图

传入请求可以有多个可配置变量,例如requestMethodrequestPathrequestHeadersrequestBodyrequestParams。该requestMethod变量对应任何有效的 HTTP 请求方法(例如GET, POST, PUT,PATCHDELETE),并且requestPath引用任何有效的字符串路径(例如/, /test,/test/path/test/path/1)。

其他可选 header,例如x-mock-response-namex-mock-response-id使你能够根据已保存示例的名称或 UID 进一步指定要返回的示例。 你可以通过使用 Postman API 获取单个集合 并在响应中搜索你的示例来获取示例 UID 。UID 的语法为<user_id>-<response_id>.

模拟请求可配置元素

匹配算法的工作原理

为了将传入请求与最接近的匹配示例进行匹配,Postman 使用以下算法。

1.获取所有示例

模拟服务获取模拟集合中的所有示例,并使用 Postman Collection SDK 将它们转换为 Postman 响应对象。如果示例的转换过程失败,导致响应不是预期的格式,则该示例将从匹配过程中删除。

模拟服务还获取与模拟服务器关联的环境(如果有的话)。然后用数据填充示例中的集合变量和环境变量。

2.通过 HTTP 方式过滤

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

匹配算法按以下顺序检查传入请求中传递的任何自定义 header:

  1. 如果x-mock-response-code提供了 header,该算法会过滤掉所有没有匹配响应状态代码的示例。

  2. 如果x-mock-response-id提供了 header,算法会选择具有匹配响应 ID 的示例并将该示例作为响应返回。如果没有找到具有匹配 ID 的示例,匹配过程将停止并且 Postman 返回错误。

  3. 如果x-mock-response-name提供了 header,算法会选择具有匹配名称的示例并将该示例作为响应返回。

    • 如果多个示例具有相同的名称,Postman 将按 ID 对示例进行排序,并返回列表中的第一个示例以及200响应状态代码。
    • 如果所有匹配示例都没有200响应状态代码,则 Postman 返回排序列表中的第一个示例。
    • 如果没有找到具有匹配名称的示例,则匹配过程停止并且 Postman 返回错误。

4. 按网址过滤

匹配算法将/path传入请求的 与/path每个已保存示例的 进行比较。然后,该算法根据路径的匹配程度为每个示例分配一个分数。

一个示例以 100 分开始。该算法按顺序执行以下步骤,并在匹配时停止。然后根据导致匹配的步骤调整分数。如果无法进行匹配,则该示例将从匹配过程中删除。

网址匹配步骤匹配分数调整
网址匹配完美无调整
删除尾部斜杠 ( /)后的 URL 匹配减少 5
URL 匹配不区分大小写减少 10
删除尾部斜杠 ( /) 后的 URL 匹配并且匹配不区分大小写减少 15
删除通配符变量 后的 URL 匹配 减少 20
删除字母数字 ID 后的 URL 匹配减少 21
删除尾部斜杠 ( /) 和字母数字 ID 后的 URL 匹配减少 25
基于 文档距离算法的 URL 匹配减少 30

例如,如果请求的 URL 是https://M1.mock.pstmn.io/test并且示例的 URL 是https://postman.com/about,算法将/test与进行比较/about。在这种情况下,路径不匹配,因此跳过相应的示例,算法移至下一个示例。

5.按参数过滤

匹配 URL 后,算法会检查每个示例的参数(例如{{url}}/path?status=pass)。根据参数匹配、部分参数匹配和缺失参数的数量进一步调整匹配分数。

  • 参数匹配- 示例中的键值对匹配传入请求中的键值对。
  • 部分参数匹配- 示例中的键与传入请求中的键匹配,但键的值不匹配。
  • 缺少参数- 示例或传入请求中存在密钥,但两者都不存在。

匹配参数的个数用于计算匹配百分比。匹配百分比等于参数匹配数除以所有参数匹配、部分参数匹配和缺失参数的总和。

参数匹配结果匹配分数调整
所有参数匹配(区分大小写)增加了 10
部分参数匹配增加 10 乘以匹配百分比
没有参数匹配减少了缺失参数的数量(最大减少 10)

6.检查 header 和 body 是否匹配

你可以在模拟服务器配置中 启用 header 和正文匹配。 x-mock-match-request-body你还可以通过传递自定义 header 或x-mock-match-request-headers请求来启用 header 和正文匹配。(这些自定义 header 的优先级高于模拟服务器配置中指定的 header 或正文匹配值。)

启用标题和正文匹配时:

  1. 该算法首先过滤掉所有与指定请求 header 不匹配的示例。header 匹配不区分大小写。
  2. 然后该算法会过滤掉所有与请求正文不匹配的示例。

当未显式启用正文匹配时,匹配算法仍会考虑请求正文。如果示例的正文与请求正文匹配,则示例的匹配分数增加 5。如果示例的正文与请求正文不匹配,则不调整示例的分数,并且不会从匹配过程中删除示例。

7.选择匹配分数最高的

匹配算法检查剩余示例的匹配分数,并返回分数最高的示例。

  • 如果有多个示例具有最高分,Postman 将按 ID 对示例进行排序,并返回列表中的第一个示例以及200响应状态代码。
  • 如果得分最高的示例都没有200响应状态代码,则 Postman 返回排序列表中的第一个示例。

使用通配符变量

示例请求中所有未解析的变量,不存在于模拟服务器的关联集合或环境中,都被视为通配符变量。通配符变量充当动态 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/1, GET /users/100, 甚至GET /users/carol. 但是这个例子不会匹配GET /users/another/segment

你可以在示例的响应中放置相同的变量以使用它们捕获的值。在这种情况下,你可以为同一示例添加请求正文,如下所示:

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

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

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

模拟服务器响应故障排除

如果模拟服务器没有返回你期望的请求示例,请尝试以下操作:

  • 向你的示例添加不同的路径变量。具有相同路径变量的两个示例将被分配相同的匹配分数。在这种情况下,Postman 将返回其中一个示例。为确保不会为多个示例分配相同的匹配分数,请为每个示例使用不同的路径变量。
  • 使用可选 header 返回特定示例。你可以通过在请求中使用x-mock-response-nameor header 来确保模拟服务器返回特定示例。x-mock-response-idPostman 将返回具有匹配名称或 UID 的示例。
  • 按响应状态代码过滤示例。你可以在请求中使用x-mock-response-codeheader 来指定所需的响应状态代码。没有匹配响应状态代码的任何示例将从匹配过程中删除。