如何格式化JSON对象以通过python中的标头发送它?

时间:2019-09-13 19:34:54

标签: python json post

我要与之交互的API要求提供“密钥”,“现成”和“签名”,以下是其构建方式:

  

”签名是通过在随机数+ HTTP方法+ requestPath + JSON有效负载(串联的字符串中没有'+'符号)的连接上使用Bitso API Secret创建SHA256 HMAC生成的,并十六进制编码输出。值应与Authorization标头中的nonce字段相同。requestPath和JSON有效负载当然必须与请求中使用的完全相同。“

问题是当我尝试发送json负载时。如果我将json有效负载作为字典发送,则程序会说不能将其串联在一起,当我将其作为字符串发送时,服务器响应会表明现时无效。

我应该如何构建json有效负载?

这是我的代码,将有效载荷作为字符串发送:

import time
import hmac
import hashlib
import requests

bitso_key = "xxxxxxxxxx"
bitso_secret = "xxxxxxxxxxxxxxxxxxxxxxxx"
nonce =  str(int(round(time.time() * 1000)))
http_method = "POST"
request_path = "/v3/orders/"
json_payload = """{'book':'xrp_mxn','side':'sell','type':'market','major':'0.5'}"""

print(json_payload)

# Create signature
message = nonce+http_method+request_path+json_payload
print(message)
signature = hmac.new(bitso_secret.encode('utf-8'),message.encode('utf-8'),hashlib.sha256).hexdigest()
# Build the auth header
auth_header = 'Bitso %s:%s:%s' % (bitso_key, nonce, signature)

# Send request
response = requests.get("https://api.bitso.com/v3/orders/", headers={"Authorization": auth_header})

print (response.content)

这是回应:

b'{"success":false,"error":{"code":"0201","message":"Nonce o credenciales inv\\u00e1lidas"}}'

如果我将它作为字典发送:

json_payload = {'book':'xrp_mxn','side':'sell','type':'market','major':'0.5'}

这是回应:

message = nonce+http_method+request_path+json_payload
TypeError: can only concatenate str (not "dict") to str

这是api的文档页面:https://bitso.com/api_info#place-an-order

2 个答案:

答案 0 :(得分:0)

您不能使用dict连接字符串,但是可以使用json库将dict转换为json字符串:

import json
import time

nonce = str(int(round(time.time() * 1000)))
http_method = "POST"
request_path = "/v3/orders/"

payload = {'book': 'xrp_mxn', 'side': 'sell', 'type': 'market', 'major': '0.5'}
json_payload = json.dumps(payload)

message = nonce + http_method + request_path + json_payload
print(message)

您得到:

1568403950209POST/v3/orders/{"major": "0.5", "type": "market", "book": "xrp_mxn", "side": "sell"}

答案 1 :(得分:0)

当user2864740和Laurent LAPORTE评论该代码出了什么问题时,是将字符串编码为JSON格式,而且我使用的代码来自API官方文档中的旧版本,因此我检查了较新的版本和格式将字典转换成JSON并完成。