了解示例匹配
使用 Postman 模拟服务需要以下条件:包含请求的集合、模拟服务器和已保存的请求示例。您可以根据需要将尽可能多的示例保存到集合中,并且模拟服务器会以可预测的方式返回这些示例。但是,mock 究竟是如何决定返回哪个示例的呢?
模拟的匹配算法
首先,让我们从一个例子开始。
当使用 Postman API 或 Postman 应用程序创建模拟时,将调用 Postman 服务器,将特定集合(和环境,如果您选择一个)与新创建的模拟相关联。刚刚模拟的集合C1
现在与新的模拟相关联M1
。
当您M1
通过 Postman 应用程序中的模拟 URL使用模拟https://M1.mock.pstmn.io
时,模拟服务将在开始匹配过程之前从 Postman 服务器检索该特定集合的所有已保存示例。
现在模拟服务已经保存了当前集合的所有示例,它现在将迭代地将传入请求与最接近的匹配示例配对。
传入的请求可以有几个可配置的变量,例如requestMethod
和mockPath
。该requestMethod
变量对应于任何有效的 HTTP 请求方法(例如GET
, POST
, PUT
, PATCH
, DELETE
, 等),而mockPath
指的是任何有效的字符串路径(例如/
, /test
, /test/path
, /test/path/1
)。
其他可选标头,例如x-mock-response-name
或x-mock-response-id
允许您进一步指定要分别由名称或已保存示例的 UID 返回的示例。您可以通过使用 Postman API获取单个集合并在响应中搜索您的示例来获取示例响应 UID 。UID 具有语法<user_id>-<response_id>
。
牢记这些不同的可配置元素,让我们看一下匹配算法逻辑。
-
格式正确的响应
任何不符合预期格式的响应都会从匹配过程中删除。
-
HTTP方法
任何不是相同 HTTP 方法类型的响应都将从匹配过程中删除。例如:如果您发送的模拟请求是
POST
tohttps://M1.mock.pstmn.io/test
,则所有保存的方法类型不是的示例都POST
将被忽略。 -
按 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
),这些参数可用于确定要显示的示例。
-
通配符
示例请求中所有未解析的变量(不存在于模拟服务器的关联环境中)都被视为通配符变量。通配符变量充当动态 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/foo/bar
。您可以在示例的响应中使用相同的变量来使用它们捕获的值。以相同的示例,您可以为相同的示例添加请求正文,如下所示:
{ "id": {{userId}}, "name": "Carol" }
这将从具有相同变量名称的通配符段捕获的值传递到响应中。
响应正文中的通配符不是匹配算法的一部分。
-
响应代码
如果
x-mock-response-code
明确提供了标头,则过滤掉所有没有匹配响应代码的示例。 -
最高阈值
将剩余的过滤响应按降序排序,并返回具有最高阈值的响应。
这就是模拟服务如何找到并返回对模拟请求的适当响应的方式。