Charles Compose中如何动态替换变量?请求体里的参数总是显示原始占位符
我在用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}能正常解析,但自定义变量就是不生效,这是怎么回事?
{
"action": "login",
"payload": {
"username": "${$global.username}",
"timestamp": "${time}"
}
}
Charles的变量解析机制有时候确实很迷,我昨天刚踩过这个坑。你那个时间变量能用是因为它本身就是全局变量,自定义变量要加$global.才能被Compose识别。
关键是:**你得把变量定义从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}。完整示例:
记得保存后重新发送请求试试。我当时就是因为没注意到Compose和Session的作用域区别,导致一直用错语法。内置变量${time}能正常解析是因为它被特殊处理了,而自定义变量就需要按照上面的方式调整位置和写法。
最后吐槽一句,Charles这文档真是不够友好,踩完坑回头看才明白原理。希望你别再掉进这个坑里了!