Karate框架解析动态键响应并验证RequestedName值的问题
Karate框架中动态键对应RequestedName的验证方案
问题背景
需要验证接口响应里payload下动态键对应的RequestedName值,响应结构示例:
{ "requestId": "c826bee1-610e-4dee-b998-1fe4f8c15a1b", "requestSource": "", "responseSource": "client", "status": 200, "responseCodes": [{"code": "S00001","message": "Success.","params": {"entity": ""}}], "context": null, "payload": { "0113ccf86ba79b698b8e7a8fb9effc4b": {"RequestedName": "paracetamol", ...}, "0349fa4ea29da419c46745bc7e2a6c07": {"RequestedName": "paracetamol", ...}, ... } }
原尝试代码执行报错:
* def list = [] * def fun = function(k, v){ karate.appendTo('list', { key: k, val: v } )} * karate.forEach(response, fun) * def keys = $list[?(@.val.payload.RequestedName==drugName)].key
错误信息:
def keys = $list[?(@.val.payload.RequestedNamedrugName)].key
Failed to parse filter: [?(@.val.payload.RequestedNamedrugName)], error on position: 32, char: d
错误原因
- 遍历对象错误:原代码遍历整个
response对象,而非response.payload,导致list里的val是requestId、payload等顶层属性,不是目标药物对象。 - JsonPath路径错误:即使遍历正确,
@.val.payload.RequestedName路径也不符合结构——val本身就是payload下的药物对象,正确路径应为@.val.RequestedName。 - 变量引用错误:JsonPath中引用Karate变量需加
$前缀(即==$drugName),否则会把drugName当成字符串字面量解析。
正确实现方案
方案一:遍历收集+过滤验证
先遍历response.payload收集键值对,再过滤验证RequestedName:
* def drugName = 'paracetamol' // 初始化列表存储payload下的键值对 * def drugEntries = [] * def collectEntries = function(key, drug) { karate.appendTo(drugEntries, { key: key, drug: drug }) } // 遍历payload下的动态键值对 * karate.forEach(response.payload, collectEntries) // 过滤出RequestedName匹配的条目 * def matchedEntries = drugEntries.filter(item => item.drug.RequestedName == drugName) // 验证所有匹配条目的RequestedName符合预期 * match each matchedEntries.drug == { RequestedName: '#(drugName)' } // 若需要获取对应的动态键 * def matchedKeys = matchedEntries.map(item => item.key) * print '匹配的动态键:', matchedKeys
方案二:直接提取值验证(更简洁)
若仅需验证RequestedName、无需获取键,可直接提取payload下所有值进行验证:
* def drugName = 'paracetamol' // 获取payload下所有药物对象的列表 * def drugList = karate.values(response.payload) // 验证所有药物的RequestedName都是指定值 * match each drugList == { RequestedName: '#(drugName)' }
方案三:遍历直接收集匹配键
若仅需获取匹配的动态键,可在遍历过程中直接判断收集:
* def drugName = 'paracetamol' * def matchedKeys = [] * def collectMatchedKeys = function(key, drug) { if (drug.RequestedName == drugName) { karate.appendTo(matchedKeys, key) } } * karate.forEach(response.payload, collectMatchedKeys) * print '匹配的动态键:', matchedKeys
内容的提问来源于stack exchange,提问作者Chetna N
相关产品推荐
相关产品推荐

