You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.RequestedName
drugName)], error on position: 32, char: d

错误原因

  1. 遍历对象错误:原代码遍历整个response对象,而非response.payload,导致list里的val是requestId、payload等顶层属性,不是目标药物对象。
  2. JsonPath路径错误:即使遍历正确,@.val.payload.RequestedName路径也不符合结构——val本身就是payload下的药物对象,正确路径应为@.val.RequestedName。
  3. 变量引用错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:55:17