示例匹配
使用 Postman 的 模拟服务器 需要一个包含请求和保存的请求示例的集合。你可以根据需要将任意数量的示例保存到集合中,模拟服务器将可预测地返回这些示例。Postman 使用匹配算法来决定返回哪些示例。
模拟服务器元素
当你创建一个模拟服务器时,Postman 将一个特定的集合(和一个可选的环境)与新的模拟服务器相关联。在下面的场景中,集合C1
与新的模拟服务器相关联M1
。
当你M1
使用模拟服务器 URL 调用模拟服务器时https://M1.mock.pstmn.io
,模拟服务会在开始匹配过程之前检索关联集合的所有已保存示例。
在模拟服务拥有集合的所有已保存示例后,它会迭代地将传入请求与最接近的匹配示例配对。
传入请求可以有多个可配置变量,例如requestMethod
、requestPath
、 requestHeaders
、requestBody
和requestParams
。该requestMethod
变量对应任何有效的 HTTP 请求方法(例如GET
, POST
, PUT
,PATCH
或DELETE
),并且requestPath
引用任何有效的字符串路径(例如/
, /test
,/test/path
或/test/path/1
)。
其他可选 header,例如x-mock-response-name
或x-mock-response-id
使你能够根据已保存示例的名称或 UID 进一步指定要返回的示例。 你可以通过使用 Postman API 获取单个集合 并在响应中搜索你的示例来获取示例 UID 。UID 的语法为<user_id>-<response_id>
.
匹配算法的工作原理
为了将传入请求与最接近的匹配示例进行匹配,Postman 使用以下算法。
1.获取所有示例
模拟服务获取模拟集合中的所有示例,并使用 Postman Collection SDK 将它们转换为 Postman 响应对象。如果示例的转换过程失败,导致响应不是预期的格式,则该示例将从匹配过程中删除。
模拟服务还获取与模拟服务器关联的环境(如果有的话)。然后用数据填充示例中的集合变量和环境变量。
2.通过 HTTP 方式过滤
任何与传入请求的 HTTP 方法类型不同的响应都将从匹配过程中删除。例如,如果模拟请求是POST
to https://M1.mock.pstmn.io/test
,则忽略方法类型不是的所有已保存示例POST
。
匹配算法按以下顺序检查传入请求中传递的任何自定义 header:
如果
x-mock-response-code
提供了 header,该算法会过滤掉所有没有匹配响应状态代码的示例。如果
x-mock-response-id
提供了 header,算法会选择具有匹配响应 ID 的示例并将该示例作为响应返回。如果没有找到具有匹配 ID 的示例,匹配过程将停止并且 Postman 返回错误。如果
x-mock-response-name
提供了 header,算法会选择具有匹配名称的示例并将该示例作为响应返回。- 如果多个示例具有相同的名称,Postman 将按 ID 对示例进行排序,并返回列表中的第一个示例以及
200
响应状态代码。 - 如果所有匹配示例都没有
200
响应状态代码,则 Postman 返回排序列表中的第一个示例。 - 如果没有找到具有匹配名称的示例,则匹配过程停止并且 Postman 返回错误。
- 如果多个示例具有相同的名称,Postman 将按 ID 对示例进行排序,并返回列表中的第一个示例以及
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 或正文匹配值。)
启用标题和正文匹配时:
- 该算法首先过滤掉所有与指定请求 header 不匹配的示例。header 匹配不区分大小写。
- 然后该算法会过滤掉所有与请求正文不匹配的示例。
当未显式启用正文匹配时,匹配算法仍会考虑请求正文。如果示例的正文与请求正文匹配,则示例的匹配分数增加 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-name
or header 来确保模拟服务器返回特定示例。x-mock-response-id
Postman 将返回具有匹配名称或 UID 的示例。 - 按响应状态代码过滤示例。你可以在请求中使用
x-mock-response-code
header 来指定所需的响应状态代码。没有匹配响应状态代码的任何示例将从匹配过程中删除。