python - 如何在python中代表邮递员的pm.request.body
问题描述
我想在 python 2.7 中对字典进行哈希处理,以获得与通过调用 pm.request 正文在邮递员中获得的结果相同的结果。当我尝试使用字符串时,散列方法可以正常工作,但我无法让正文散列相同。我在 python 中使用集合包中的 OrderedDictionary。我假设 pm.body.request 将是 JSON,但似乎并非如此。
下午身体
{
"personNumber": "195012161930",
"requestDescription": "Detta ar ett test",
"verksamhetId": "1ac12a80-819a-42ca-bd51-97bd3e19c443",
"stadsDelID": "f55a5bea-2398-11e9-8140-0e9ccdb68c09"
}
PM 中的预请求脚本
var hmacKey = 'c811f8ae-dd9f-4b15-9a09-97a09bdbb485';
var contentToHash = pm.request.body.raw;
var cryptoJs = require('crypto-js');
var hash = cryptoJs.HmacSHA256(contentToHash, hmacKey);
var hashInBase64 = cryptoJs.enc.Base64.stringify(hash);
console.log(hashInBase64 + " This is the result");
我在 Python 中尝试过的内容
key = "c811f8ae-dd9f-4b15-9a09-97a09bdbb485"
od = OrderedDict()
od['personNumber'] = "195012161111"
od['requestDescription'] = "Detta ar ett test"
od['verksamhetId'] = "1ac12a80-819a-42ca-bd51-97bd3e19c443"
od['stadsDelID'] = "f55a5bea-2398-11e9-8140-0e9ccdb68c09"
contentToHash = (json.dumps((od)))
hash = hmac.new( key, (contentToHash), hashlib.sha256)
baseHash = base64.b64encode(hash.digest())
print(baseHash + " This is the result in Python")
这是运行预请求脚本 '25iZC8NycCILZJCGN9T2jachFANGD4HkLSp+8X0W/Jk=' 后 hashInBase64 的预期值
解决方案
解决您的问题:
Python2:
from collections import OrderedDict
import json
import hmac
import hashlib
import base64
key = bytearray("c811f8ae-dd9f-4b15-9a09-97a09bdbb485","utf-8")
od = OrderedDict()
od['personNumber'] = "195012161930"
od['requestDescription'] = "Detta ar ett test"
od['verksamhetId'] = "1ac12a80-819a-42ca-bd51-97bd3e19c443"
od['stadsDelID'] = "f55a5bea-2398-11e9-8140-0e9ccdb68c09"
contentToHash = json.dumps(od,indent=2,separators=(',', ': '))
contentToHash = contentToHash.replace("\n","\r\n")
print(repr(contentToHash))
hash = hmac.new( key, (contentToHash).encode('utf-8'), hashlib.sha256)
baseHash = base64.b64encode(hash.digest())
print(str(baseHash) + " This is the result in Python")
Python3:
from collections import OrderedDict
import json
import hmac
import hashlib
import base64
key = bytearray("c811f8ae-dd9f-4b15-9a09-97a09bdbb485","utf-8")
od = OrderedDict()
od['personNumber'] = "195012161930"
od['requestDescription'] = "Detta ar ett test"
od['verksamhetId'] = "1ac12a80-819a-42ca-bd51-97bd3e19c443"
od['stadsDelID'] = "f55a5bea-2398-11e9-8140-0e9ccdb68c09"
contentToHash = json.dumps(od,indent="\r ",separators=(',', ': '))
contentToHash=contentToHash.replace("\n\r","\r\n")
contentToHash = contentToHash.replace("\n}","\r\n}")
print(repr(contentToHash))
hash = hmac.new( key, (contentToHash).encode('utf-8'), hashlib.sha256)
baseHash = base64.b64encode(hash.digest())
print(str(baseHash) + " This is the result in Python")
邮差:
var hmacKey = 'c811f8ae-dd9f-4b15-9a09-97a09bdbb485';
var contentToHash = pm.request.body.raw;
console.log(JSON.stringify(contentToHash))
var cryptoJs = require('crypto-js');
var hash = cryptoJs.HmacSHA256(contentToHash, hmacKey);
var hashInBase64 = cryptoJs.enc.Base64.stringify(hash);
console.log(hashInBase64 + " This is the result");
正确的做法:
您应该删除空格以使其适用于所有应用程序:
pm.request.body 不仅返回正文内容,还返回具有内容类型的完整正文对象
所以你应该使用
pm.request.body.raw
但这仍然会有空间,你可以使用删除它
JSON.stringify(JSON.parse(pm.request.body.raw))
现在在 python 代码中存在相同的空间问题,您可以使用它来删除它
contentToHash = json.dumps(od,separators=(',', ':'))
Python代码:
from collections import OrderedDict
import json
import hmac
import hashlib
import base64
key = bytearray("c811f8ae-dd9f-4b15-9a09-97a09bdbb485","utf-8")
od = OrderedDict()
od['personNumber'] = "195012161111"
od['requestDescription'] = "Detta ar ett test"
od['verksamhetId'] = "1ac12a80-819a-42ca-bd51-97bd3e19c443"
od['stadsDelID'] = "f55a5bea-2398-11e9-8140-0e9ccdb68c09"
contentToHash = json.dumps(od,separators=(',', ':'))
hash = hmac.new( key, (contentToHash).encode('utf-8'), hashlib.sha256)
baseHash = base64.b64encode(hash.digest())
print(str(baseHash) + " This is the result in Python")
邮递员预请求:
var hmacKey = 'c811f8ae-dd9f-4b15-9a09-97a09bdbb485';
var contentToHash = JSON.stringify(JSON.parse(pm.request.body.raw),null,null)
var cryptoJs = require('crypto-js');
var hash = cryptoJs.HmacSHA256(contentToHash, hmacKey);
console.log(hash)
var hashInBase64 = cryptoJs.enc.Base64.stringify(hash);
console.log(hashInBase64 + " This is the result");
推荐阅读
- amcharts - 如何在面积图上显示背景网格?
- angular - 确保在继续之前完成服务
- python - Django objects.create 产生的输出超出预期
- angular - ng2-charts - 条形图,只显示一种颜色
- c# - 如何以编程方式从 Google 云端硬盘中的“与我共享”中删除文件
- python - Python3:无法获取 Gtk.SpinButton 值
- symfony - Symfony 4.3 Multiple ChoiceType 使用 PATCH 时只能添加值不能删除
- php - Codeigniter 查询错误:未定义偏移量 1
- ms-access - IsNotNull 访问函数
- react-native - 服务器响应后如何执行操作?