import java.util.Base64
import groovy.json.JsonSlurper
import groovy.json.JsonOutput// =============================================================
// ✅ 环境兼容:本地调试可运行(无 JMeter 环境时)
// =============================================================
if (!binding.hasVariable("vars")) {
vars = new HashMap()
prev = [ getResponseDataAsString: { -> vars.get("mockResponse") ?: "" } ] as Object
log = [ info : {msg -> println "[INFO ] $msg"},
warn : {msg -> println "[WARN ] $msg"},
error: {msg -> println "[ERROR] $msg"} ] as Object
}// =============================================================
// Step 1️⃣ 获取HTTP响应数据
// =============================================================
def responseBody = prev.getResponseDataAsString()?.trim()
if (!responseBody) {
log.warn("❗未检测到响应内容,请检查接口返回或Sampler配置。")
return
}
log.info("====== 🌐【原始接口返回】======\n" + responseBody)// =============================================================
// Step 2️⃣ 尝试解析最外层JSON
// =============================================================
def json
try {
json = new JsonSlurper().parseText(responseBody)
} catch (e) {
log.error("❌ 响应体不是合法JSON,原文:\n${responseBody}")
return
}// =============================================================
// Step 3️⃣ 提取 payload 字段
// =============================================================
def base64Payload = json.payload
if (!base64Payload) {
log.info("⚠️ 未找到 payload 字段,可能无需解码,直接解析。")
}// =============================================================
// Step 4️⃣ Base64 解码(第一层)
// =============================================================
def decodedStr1 = responseBody
if (base64Payload) {
try {
decodedStr1 = new String(Base64.getDecoder().decode(base64Payload), "UTF-8")
log.info("====== 🔍【第一层Base64解码结果】======\n" + decodedStr1)
} catch (e) {
log.error("❌ 第一层Base64解码失败:" + e.getMessage())
return
}
}// =============================================================
// Step 5️⃣ 检查是否还有嵌套payload(第二层)
// =============================================================
def decodedStr = decodedStr1
try {
def inner = new JsonSlurper().parseText(decodedStr1)
if (inner.payload) {
decodedStr = new String(Base64.getDecoder().decode(inner.payload), "UTF-8")
log.info("====== 🔄【检测到第二层payload,继续解码】======\n" + decodedStr)
}
} catch (ignore) {}// =============================================================
// Step 6️⃣ 尝试转为JSON对象(若可能)
// =============================================================
def decodedObj
try {
decodedObj = new JsonSlurper().parseText(decodedStr)
} catch (e) {
log.warn("⚠️ 解码结果不是标准JSON字符串:\n${decodedStr}")
}// =============================================================
// Step 7️⃣ 输出到日志和JMeter变量(增强版)
// =============================================================
if (decodedObj) {
vars.put("decodedJsonStr", decodedStr)
vars.put("decodedJsonPretty", JsonOutput.prettyPrint(JsonOutput.toJson(decodedObj)))
log.info("====== ✅【最终解码JSON】======\n" + JsonOutput.prettyPrint(JsonOutput.toJson(decodedObj)))// 自动提取一级字段
decodedObj.each { k, v ->
if (v instanceof String || v instanceof Number) {
vars.put("decoded_" + k, v.toString())
}
}// =============================================================
// ✅ 递归查找 变量
// =============================================================
def foundIds = [:]def findIds
findIds = { obj ->
if (obj instanceof Map) {
obj.each { k, v ->
if (k.toLowerCase() in ["token", "code"]) {
foundIds[k] = v?.toString()
}
findIds(v)
}
} else if (obj instanceof List) {
obj.each { item -> findIds(item) }
}
}findIds(decodedObj)
if (!foundIds.isEmpty()) {
foundIds.each { k, v ->
vars.put(k, v)
log.info("📦 已提取 ${k} = ${v}")
}
} else {
log.info("(未检测到 pushId 或 publishId 字段)")
}} else {
vars.put("decodedRaw", decodedStr)
log.info("====== ✅【最终解码字符串】======\n${decodedStr}")
}// =============================================================
// Step 8️⃣ (可选)用于本地调试
// =============================================================
// vars.put("mockResponse", '{"to":{"client":{"pushId":"66A058DA-41EF-36B4-80A3-FC17FE3DDBF1"}}}')
beanshell 处理返回Base64解码例子
最新推荐文章于 2025-12-05 17:02:52 发布
3015

被折叠的 条评论
为什么被折叠?



