繁体   English   中英

如何在 python 中表示来自 postman 的 pm.request.body

[英]How to represent pm.request.body from postman in python

我想 hash 字典 python 2.7 以获得与我在 postman 中通过调用 pm.request 正文获得的结果相同的结果。 当我尝试使用字符串时,哈希方法可以正常工作,但我无法将正文与 hash 相同。 我在 python 中使用来自 collections package 的 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")

Postman:

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 不仅返回正文内容,还返回带有内容类型的完整正文 object

所以你应该使用

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")

Postman 预请求:

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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM