
本文详解在 k6 性能测试脚本中,如何安全、准确地将第一个 http 请求的响应体(response body)直接用于第二个 post 请求的请求体,避免因误用 `json.stringify()` 导致 json 格式污染和解析失败。
在 k6 中跨请求复用响应体是一个常见需求(例如:获取 Token、提取动态 payload、链式调用 API),但一个极易被忽视的陷阱是——对已为合法 JSON 字符串的 res1.body 重复执行 JSON.stringify()。
假设你这样写:
const res1 = http.get('https://api.example.com/data');
const payload = JSON.stringify(res1.body); // ❌ 错误!res1.body 已是字符串(即使内容是 JSON)
const res2 = http.post('https://api.example.com/submit', payload, {
headers: { 'Content-Type': 'application/json' }
});此时 res1.body 实际是一个原始字符串(如 "{\n \"highlight\": {...}"),它虽符合 JSON 语法,但本质是字符串类型。若再套一层 JSON.stringify(),就会变成:
"{\"\\n \\\"highlight\\\": {\\n \\\"...\"}}"即:反斜杠被双重转义,JSON 结构被破坏,后端无法解析。
✅ 正确做法是:直接使用 res1.body,无需序列化(前提是服务端期望接收原始 JSON 字符串):
const res1 = http.get('https://api.example.com/data');
// ✅ 直接复用 —— res1.body 就是你要发送的 JSON 字符串
const res2 = http.post('https://api.example.com/submit', res1.body, {
headers: { 'Content-Type': 'application/json' }
});⚠️ 补充注意事项:
- 若需对 res1.body 做字段修改(如替换 ID、添加时间戳),应先 JSON.parse(res1.body) 转为对象,修改后再 JSON.stringify() —— 但仅在此类场景下才需要序列化;
- 使用 console.log(JSON.stringify(res1.body, null, 2)) 可美化输出便于调试,但切勿将其结果用于请求体;
- 确保目标接口明确接受 application/json 类型,并验证 res1.body 确实为有效 JSON(可用 try/catch + JSON.parse() 做健壮性校验)。
总结:k6 中 response.body 默认为字符串,不是 JavaScript 对象。是否需要 JSON.stringify() 取决于你的数据来源和用途——从响应中直接读取的 body,通常可直传;从 JS 对象构造的数据,才需序列化。 把握这一根本区别,即可彻底规避“被转义的 JSON”问题。










