You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Postman预请求脚本变量解析与签名生成顺序问题求助

解决方案:Postman 预请求脚本签名与变量解析冲突问题

方案1:手动解析请求体变量(替代强制预解析)

Postman本身不支持强制在预请求脚本前解析所有变量,但可以在脚本内手动完成变量解析,确保签名基于实际请求体生成:

  • 获取带占位符的原始请求体:通过pm.request.body.raw获取未解析的请求体文本
  • 解析变量:用pm.variables.replaceIn()方法替换所有{{Variable Name}}占位符为实际值
  • 生成签名:基于解析后的请求体执行加密+base64编码逻辑
  • 设置请求头:将生成的Signature值写入请求头

示例代码:

// 获取原始请求体(含变量占位符)
const rawBody = pm.request.body.raw;
// 解析所有变量,得到实际请求体内容
const parsedBody = pm.variables.replaceIn(rawBody);

// 替换为你的加密逻辑,示例用SHA256加密后base64编码
const signature = btoa(CryptoJS.SHA256(parsedBody).toString(CryptoJS.enc.Hex));

// 设置Signature请求头
pm.request.headers.add({
    key: 'Signature',
    value: signature
});

方案2:间接实现“请求发送前生成签名”

Postman没有专门的延迟执行选项,但可以通过环境变量中转请求体的方式,间接达到签名基于最终请求体生成的效果:

  1. 在预请求脚本中解析变量,得到实际请求体并存入环境变量
  2. 修改请求体为引用该环境变量
  3. 基于解析后的请求体计算签名并设置请求头

示例代码:

// 解析请求体变量
const rawBody = pm.request.body.raw;
const parsedBody = pm.variables.replaceIn(rawBody);

// 将解析后的请求体存入环境变量
pm.environment.set('parsedRequestBody', parsedBody);

// 把请求体替换为引用环境变量
pm.request.body.update({
    mode: 'raw',
    raw: '{{parsedRequestBody}}'
});

// 计算并设置签名
const signature = btoa(CryptoJS.SHA256(parsedBody).toString(CryptoJS.enc.Hex));
pm.request.headers.add({ key: 'Signature', value: signature });

注意事项

  • 若请求体为form-dataurlencoded格式,需调整解析逻辑,遍历字段逐一替换变量
  • 使用CryptoJS时,需在Postman设置的「通用」中开启「允许使用不安全的脚本」

内容的提问来源于stack exchange,提问作者Dan Hanly

火山引擎 最新活动