You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postman预请求脚本获完整请求体算哈希及重现C# DelegatingHandler

在Postman中重现C# DelegatingHandler:完整预请求脚本(含请求体哈希计算)

嘿,我帮你梳理下怎么在Postman里搞定这个C# DelegatingHandler的认证逻辑,核心就是要正确拿到请求体来计算哈希对吧?下面是完整的预请求脚本,还有关键细节的说明:

完整预请求脚本

// 生成随机Nonce的辅助函数
function S4() {
    return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}

function GetNonce() {
    return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4()).toLowerCase();
}

// 获取秒级时间戳
function GetTimeStamp() {
    var d = new Date();
    return Math.round(d.getTime() / 1000);
}

// 兼容多种请求类型的请求体获取函数
function getRequestBody() {
    let body = "";
    // 处理Raw类型(JSON、纯文本等)
    if (pm.request.body.mode === 'raw') {
        // 如果是JSON,建议压缩掉空格,和C#序列化的格式保持一致
        if (pm.request.body.options.raw.language === 'json') {
            body = JSON.stringify(JSON.parse(pm.request.body.raw));
        } else {
            body = pm.request.body.raw;
        }
    }
    // 处理Form-Data类型
    else if (pm.request.body.mode === 'formdata') {
        // 按键值对拼接,注意编码要和后端一致
        const formItems = pm.request.body.formdata.members;
        body = formItems.map(item => `${item.key}=${encodeURIComponent(item.value)}`).join('&');
    }
    // 处理URL-Encoded类型
    else if (pm.request.body.mode === 'urlencoded') {
        const urlEncodedItems = pm.request.body.urlencoded.members;
        body = urlEncodedItems.map(item => `${item.key}=${encodeURIComponent(item.value)}`).join('&');
    }
    // Binary类型根据实际需求处理,这里默认空字符串
    return body;
}

// 计算认证头的核心函数
function getAuthHeader(httpMethod, requestUrl, requestBody) {
    // 生成Nonce和时间戳
    const nonce = GetNonce();
    const timestamp = GetTimeStamp();
    
    // 这里替换成你C# DelegatingHandler中使用的哈希源字符串格式
    // 要和后端逻辑完全一致,否则哈希会不匹配
    const hashSource = `${httpMethod.toUpperCase()}|${requestUrl}|${timestamp}|${nonce}|${requestBody}`;
    
    // 计算SHA256哈希(根据你的需求替换为MD5、SHA1等)
    const hashValue = CryptoJS.SHA256(hashSource).toString(CryptoJS.enc.Hex);
    
    // 构造认证头,格式和后端要求匹配
    return `CustomAuth nonce="${nonce}", timestamp="${timestamp}", hash="${hashValue}"`;
}

// 执行脚本并设置请求头
const requestBody = getRequestBody();
const authHeaderValue = getAuthHeader(pm.request.method, pm.request.url.toString(), requestBody);

// 添加/更新Authorization请求头
pm.request.headers.upsert({key: 'Authorization', value: authHeaderValue});

关键细节说明

  • 请求体兼容性:Postman不同的请求模式(Raw/Form-Data/URL-Encoded)存储请求体的结构不一样,所以脚本里分情况处理,确保拿到的请求体和C#后端接收到的完全一致,这是哈希匹配的关键。
  • JSON格式对齐:如果是Raw JSON请求,Postman默认可能会有格式化空格,而C#序列化的JSON可能是压缩后的,所以脚本里加了JSON.stringify(JSON.parse(...))来压缩空格,避免哈希不一致。
  • 哈希计算:Postman内置了CryptoJS库,直接用它来计算哈希,和C#中的SHA256Managed等方法对应,记得根据你的实际需求替换哈希算法。
  • 认证头格式:脚本里的认证头是示例格式,你需要根据C# DelegatingHandler中生成的认证头格式来调整,比如参数名、分隔符等。

测试建议

  1. 先在C#中手动生成一次认证头,记录Nonce、Timestamp、请求体和哈希值。
  2. 在Postman中发送相同请求,查看预请求脚本生成的参数是否和C#一致,哈希值是否匹配。
  3. 如果哈希不匹配,优先检查请求体的内容是否完全一致(包括空格、编码),然后检查哈希源字符串的拼接格式。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:21:56