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

如何使用Tosca验证JSON响应中动态IP数组的取值?

在Tosca中验证动态IP数组的困境

我需要在Tosca中验证某JSON响应里的40个IP数组值,该数组的IP数量与取值均为动态。原本计划将数组值存入缓冲区后循环验证,但遇到以下问题:

  • Tosca无法将JSON中的数组作为数组/集合进行缓冲
  • Tosca无法将JSON中的数组值作为字符串进行缓冲
  • 曾考虑将完整响应存入文本并移除无用元素,但该JSON响应结构过于复杂,无法逐一替换
  • 仅能选择即时验证IP,但实现循环需发起40次API请求,因Tosca不支持仅基于响应进行循环

示例IP数组:

"ips": [
    "10.123.0.0/16",
    "10.115.56.0/21",
    "10.115.178.0/23",
    "10.115.228.0/22",
    "10.115.246.0/23",
    "10.115.248.0/21",
    "10.116.210.0/23",
    "10.116.212.0/22",
    "10.116.226.0/23",
    "10.116.228.0/22",
    "10.116.242.0/23",
    "10.116.246.0/23",
    "10.116.248.0/21",
    "10.255.48.0/23",
    "10.255.50.0/23",
    "10.255.52.0/23",
    "10.255.54.0/23",
    "10.255.56.0/23",
    "10.255.58.0/23",
    "10.255.60.0/23",
    "10.255.62.0/23",
    "10.255.64.0/23",
    "10.255.66.0/23",
    "10.255.68.0/24",
    "10.255.70.0/23",
    "10.18.161.0/23",
    "10.18.164.0/22",
    "10.100.0.0/20",
    "13.236.48.140",
    "13.236.237.91",
    "54.66.186.185",
    "172.21.1.42",
    "172.21.1.51",
    "124.157.92.34",
    "10.116.209.25",
    "10.9.0.0/16",
    "10.115.0.0/16",
    "10.116.220.32",
    "10.116.220.29",
    "10.116.220.18"
]
可行解决方案

1. JSON Path+循环索引遍历

先通过JSON Path提取数组长度$.ips.length()存入缓冲区,再用TestStep Loop组件绑定这个长度值作为循环次数。循环内部用带索引的JSON Path$.ips[{{LoopIndex}}]提取单个IP,每次循环验证当前IP的格式或取值。这种方法只需要1次API请求,循环复用已获取的响应,无需重复调用接口。

2. Scripting模块解析验证

添加Scripting TestStep,将完整JSON响应传入脚本(支持C#/VBScript),在脚本里解析JSON提取ips数组,用正则逐个验证IP格式,最后返回验证结果给Tosca。

示例C#脚本片段:

using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;

public class Script
{
    public static void Main()
    {
        string jsonResponse = Context.Get<string>("JsonResponseBuffer");
        JObject responseObj = JObject.Parse(jsonResponse);
        JArray ipsArray = (JArray)responseObj["ips"];
        bool allValid = true;

        foreach (var ip in ipsArray)
        {
            string ipStr = ip.ToString();
            // 匹配IP/CIDR格式的正则
            string pattern = @"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\/([0-9]|[1-2][0-9]|3[0-2]))?$";
            if (!Regex.IsMatch(ipStr, pattern))
            {
                allValid = false;
                Context.Set("ValidationError", $"无效IP: {ipStr}");
                break;
            }
        }

        Context.Set("AllIPsValid", allValid);
    }
}

后续在Tosca中添加验证步骤,检查AllIPsValid缓冲区值是否为True,有错误则读取ValidationError查看详情。

3. 动态缓冲集合提取

创建Dynamic Buffer,设置JSON Path为$.ips[*],Tosca会自动将数组每个元素作为缓冲条目存入。再用TestStep Loop遍历这个缓冲集合,每次循环验证当前条目的值。部分Tosca版本需开启缓冲配置里的“允许集合提取”选项。

4. JSON转XML后用XPath处理

将JSON响应转换为XML(Tosca内置支持),转换后数组元素会被包装为<ips>节点,用XPath//ips获取所有IP元素,再通过TestStep Loop遍历验证。

内容的提问来源于stack exchange,提问作者Forged

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:45:19