Charles Compose中如何动态替换变量?请求体里的参数总是显示原始占位符

艳青 阅读 63

我在用Charles的Compose功能构造POST请求时遇到问题,想在请求体里动态替换变量,但发送后请求体还是显示原始占位符比如${username}

我已经在Map Request里设置了变量username = "testUser",并在请求体里写成{"user": "${username}"}。但实际请求却发送了未解析的字符串,服务端返回了参数错误。

试过重启Charles和检查变量作用域,都没用。有没有可能是Compose的语法不对?或者变量定义的位置需要调整?


// 我的变量定义在Session标签下
Set Variable: username = "testUser"

// Compose的请求体写法
{
  "action": "login",
  "payload": {
    "username": "${username}",
    "timestamp": "${time}"
  }
}

奇怪的是时间变量${time}能正常解析,但自定义变量就是不生效,这是怎么回事?

我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
红霞的笔记
变量作用域不对,Map Request里定义的变量在Compose里用要加$global.前缀。改成这样:

{
"action": "login",
"payload": {
"username": "${$global.username}",
"timestamp": "${time}"
}
}

Charles的变量解析机制有时候确实很迷,我昨天刚踩过这个坑。你那个时间变量能用是因为它本身就是全局变量,自定义变量要加$global.才能被Compose识别。
点赞 7
2026-02-05 10:12
宇文锦玉
当时我也卡在这,折腾了半天才发现问题出在哪。Charles的Compose功能里,自定义变量解析确实有点坑,但${time}这种内置变量又很正常,这就让人容易混淆。

关键是:**你得把变量定义从Session标签下挪到Compose的Headers或者Query String里!**

具体步骤:
1. 在Compose界面,找到Headers部分,点击右上角的“+”按钮。
2. 添加一个新Header,名字随便起,比如X-User-Var,值写成${username}
3. 同时在Map Request里保持你的变量定义:Set Variable: username = "testUser"
4. 最重要的一点,Compose请求体里的变量写法要改成:{{username}},而不是${username}

完整示例:

{
"action": "login",
"payload": {
"username": "{{username}}",
"timestamp": "${time}"
}
}


记得保存后重新发送请求试试。我当时就是因为没注意到Compose和Session的作用域区别,导致一直用错语法。内置变量${time}能正常解析是因为它被特殊处理了,而自定义变量就需要按照上面的方式调整位置和写法。

最后吐槽一句,Charles这文档真是不够友好,踩完坑回头看才明白原理。希望你别再掉进这个坑里了!
点赞 16
2026-01-30 23:01