如何用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
相关产品推荐
相关产品推荐

