rocksteady的解决方案有效
他最初确实参考过字典。但是以下发送JSON字符串的代码在使用请求时也产生了奇迹:import requests
headers = {
'Authorization': app_token
}
url = api_url + "/b2api/v1/b2_get_upload_url"
content = json.dumps({'bucketId': bucket_id})
r = requests.post(url, data = content, headers = headers)
我正在使用一个API,它要求我将JSON作为POST请求发送以获取结果。问题是Python 3不允许我这样做。
下面的Python2代码工作得很好,实际上它是正式的示例:request = urllib2.Request(
api_url +'/b2api/v1/b2_get_upload_url',
json.dumps({ 'bucketId' : bucket_id }),
headers = { 'Authorization': account_authorization_token }
)
response = urllib2.urlopen(request)
但是,在Python3中使用此代码只会使它抱怨数据无效:import json
from urllib.request import Request, urlopen
from urllib.parse import urlencode
# -! Irrelevant code has been cut out !-
headers = {
'Authorization': app_token
}
url = api_url + "/b2api/v1/b2_get_upload_url"
# Tested both with encode and without
content = json.dumps({'bucketId': bucket_id}).encode('utf-8')
request = Request(
url=url,
data=content,
headers=headers
)
response = urlopen(req)
我试过做urlencode(),就像你应该做的那样。但这将从web服务器返回400状态代码,因为它需要纯JSON。即使纯JSON数据无效,我也需要以某种方式强制Python发送它。
编辑:根据要求,这里是我得到的错误。由于这是一个flask应用程序,下面是调试器的屏幕截图:
添加.encode('utf-8')会产生“预期的字符串或缓冲区”错误
编辑2:添加了.encode('utf-8')的调试器的Screenshot