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

如何用Karate验证含多Zip(内有JSON)的二进制响应

如何验证包含多个Zip文件的二进制接口响应(Karate)

你遇到的问题核心是接口返回的并非单个合法Zip文件,而是多个Zip文件拼接而成的二进制流。直接将整个响应存为单个.zip文件时,普通解压工具无法识别这种非标准结构,导致解压出损坏或空文件。以下是具体解决步骤:

步骤1:先保存原始二进制响应排查结构

先不要直接存为.zip,而是存为二进制文件,确认里面的Zip分隔特征:

* karate.write(response, "response_raw.bin")

用二进制编辑器打开这个文件,你会发现每个Zip文件都以固定签名PK\x03\x04(十六进制50 4B 03 04)开头,这是拆分多个Zip的关键标识。

步骤2:在Karate中拆分二进制流为多个独立Zip

利用Karate的Java互操作能力,编写函数扫描二进制数组,找到所有Zip的起始位置并拆分:

* def splitMultipleZips = function(rawBytes) {
    // Zip文件的起始签名字节数组
    def pkStart = [0x50, 0x4B, 0x03, 0x04];
    def zipStartIndices = [];
    
    // 遍历原始字节,找出所有Zip起始位置
    for (int i = 0; i <= rawBytes.length - 4; i++) {
        boolean isZipStart = true;
        for (int j = 0; j < 4; j++) {
            if (rawBytes[i + j] != pkStart[j]) {
                isZipStart = false;
                break;
            }
        }
        if (isZipStart) {
            zipStartIndices.add(i);
        }
    }
    
    // 拆分每个Zip的字节数组
    def zipList = [];
    for (int k = 0; k < zipStartIndices.size(); k++) {
        int start = zipStartIndices.get(k);
        int end = (k == zipStartIndices.size() - 1) ? rawBytes.length : zipStartIndices.get(k + 1);
        byte[] zipBytes = java.util.Arrays.copyOfRange(rawBytes, start, end);
        zipList.add(zipBytes);
    }
    return zipList;
}

// 拆分响应得到多个Zip字节数组
* def zips = splitMultipleZips(response)

// 逐个保存为独立Zip文件
* zips.forEach(function(zip, idx) { karate.write(zip, "extracted_zip_" + idx + ".zip") })

步骤3:验证每个Zip内的JSON文件

拆分后,可以直接用Karate的karate.unzip()方法读取Zip内的JSON内容并验证:

// 验证第一个Zip里的JSON文件(假设文件名为data.json)
* def firstZipContent = karate.unzip(zips[0])
* def firstJson = firstZipContent['data.json']
* match firstJson contains { id: '#number', name: '#string' }

// 遍历所有Zip验证
* zips.forEach(function(zip) {
    def content = karate.unzip(zip)
    // 假设每个Zip至少有一个json文件,遍历验证
    for (var key in content) {
        if (key.endsWith('.json')) {
            def json = content[key]
            // 这里写你的JSON验证规则,比如检查必要字段
            * match json contains { code: 200 }
        }
    }
})

额外排查点:响应是否被压缩

如果响应头包含Content-Encoding: gzip,需要先解压原始响应再处理:

* def contentEncoding = responseHeaders['Content-Encoding'] ? responseHeaders['Content-Encoding'][0] : null
* if (contentEncoding == 'gzip') {
    * response = karate.unzip(response)
  }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:31:04