使用Python3,Django和Django Rest框架。 以前我有一个测试用例正在对端点进行POST。 有效载荷是一本字典:
mock_data = {some data here}
为了通过我正在执行的POST发送数据:
mock_data = base64.b64encode(json.dumps(mock_data).encode('utf-8'))
执行POST时:
response = self.client.post(
'/some/path/here/', {
...,
'params': mock_data.decode('utf-8'),
},
)
在接收端,我在做validate()方法:
params = data['params']
try:
params_str = base64.b64decode(params).decode('utf-8')
app_data = json.loads(params_str)
except (UnicodeDecodeError, ValueError):
app_data = None
这一切都很好,但现在我需要使用一些hmac验证,而我传递的json不再是dict - 它的排序每次都会改变,所以hmac.new(秘密,有效载荷,算法)会与众不同。 我试图使用字符串:
payload = """{data in json format}"""
但是当我在做的时候:
str_payload = payload.encode('utf-8')
b64_payload = base64.b64encode(str_payload)
我无法发布它,并收到错误:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'ewog...Cn0=' is not JSON serializable
即使我像以前一样b64_payload.decode('utf-8')
,仍然会遇到类似的错误:
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b'\xa2\x19...\xff' is not JSON serializable
终端中的一些python:
>>> d = {'email': 'user@mail.com'} # regular dictionary
>>> d
{'email': 'user@mail.com'}
>>> dn = base64.b64encode(json.dumps(d).encode('utf-8'))
>>> dn
b'eyJlbWFpbCI6ICJ1c2VyQG1haWwuY29tIn0='
>>> s = """{"email": "user@mail.com"}""" # string
>>> s
'{"email": "user@mail.com"}'
>>> sn = base64.b64encode(json.dumps(s).encode('utf-8'))
>>> sn
b'IntcImVtYWlsXCI6IFwidXNlckBtYWlsLmNvbVwifSI=' # different!
>>> sn = base64.b64encode(s.encode('utf-8'))
>>> sn
b'eyJlbWFpbCI6ICJ1c2VyQG1haWwuY29tIn0=' # same
答案 0 :(得分:0)
问题已解决。 问题不在于有效载荷,而在于我传递的参数:
(from je in dbo.JournalEntries
where je.FKSubscriberID == 3 && je.FKAccountID == 3
group je by 1 into jeg
select jeg.Sum(je => je.CreditAmount) - jeg.Sum(je => je.DebitAmount)).First()
通过传递签名字段解决:
(from je in dbo.JournalEntries
where je.FKSubscriberID == 3 && je.FKAccountID == 3
select je.CreditAmount-je.DebitAmount).Sum()
谢谢!