我有一个 JSON 存根配置,如下 -
{
"mappings": [
{
"request": {
"method": "GET",
"url": "/student",
"headers": {
"X-Request-ID": {
"hasExactly": [
{
"equalTo": "Demo1"
},
{
"contains": "Demo2"
},
{
"doesNotContain": "Demo3"
}
]
}
}
},
"response": {
"status": 200,
"headers": {
"Content-Type": "application/json"
},
"jsonBody": {
"studentId": 1
}
}
}
]
}
根据我的理解,X-Request-ID 应该恰好具有三个值,如果一个值等于“Demo1”,则不应评估剩余两个值的条件。其他值和条件也是如此。
第一个值 = Demo1 -> 满足“equalTo”:“Demo1”(接下来的 2 个不应检查此条件)
第二个值 = Demo2 -> 满足“包含”:“Demo2”
第三个值 = Demo3 -> 这里我们只剩下一个条件,即“doesNotContain”:“Demo3”,并且第三个值不满足它。
但它似乎只检查三个值,但如果它找到匹配的两个条件的相同值。
hasExactly
数组中对象的位置不是位置性的,这意味着仅仅因为对象位于第一个位置,它不仅会检查第一个标头。
这会导致匹配发生(您希望它不会发生),因为正在进行以下检查:
X-Request-ID
标题 (✅)X-Request-ID
标题满足 "equalTo": "Demo1"
(✅ - 第一个标题)X-Request-ID
标题满足 "contains": "Demo2"
(✅ - 第二个标题)X-Request-ID
标头满足 "doesNotContain": "Demo3"
(✅ - 第一个和第二个标头)您可以通过更简单的映射来证明此行为:
{
"request": {
"method": "GET",
"url": "/foo",
"headers": {
"X-Request-ID": {
"hasExactly": [
{ "equalTo": "1"},
{ "contains": "1"}
]
}
}
},
"response": {
"status": 200
}
}
并发送带有以下
X-Request-ID
标头的请求:
X-Request-ID: 1
和 X-Request-ID: 2
。
不幸的是,我不确定是否有现成的解决方案可以满足您的要求。我建议考虑实现一个 Custom Matcher 来处理这个逻辑。