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中生成的认证头格式来调整,比如参数名、分隔符等。
测试建议
- 先在C#中手动生成一次认证头,记录Nonce、Timestamp、请求体和哈希值。
- 在Postman中发送相同请求,查看预请求脚本生成的参数是否和C#一致,哈希值是否匹配。
- 如果哈希不匹配,优先检查请求体的内容是否完全一致(包括空格、编码),然后检查哈希源字符串的拼接格式。
内容的提问来源于stack exchange,提问作者Misiu
相关产品推荐
相关产品推荐

