我正在尝试在Python 3中进行Web服务调用。请求的一个子集包含一个base64编码的字符串,该字符串来自Python字典列表。
所以我转储列表并对字符串进行编码:
j = json.dumps(dataDictList, indent=4, default = myconverter)
encodedData = base64.b64encode(j.encode('ASCII'))
然后,当我构建我的请求时,我添加了该字符串。因为它以字节形式返回,我需要将其更改为字符串:
...
\"data\": \"''' + str(encodedData) + '''\"
...
我从网络服务获得的回复是我的请求格式不正确。当我打印str(encodedData)时,我得到:
b'WwogICAgewogICAgICAgICJEQVlfREFURSI6ICIyMDEyLTAzLTMxIDAwOjAwOjAwIiwKICAgICAgICAiQ0FMTF9DVFJfSUQiOiA1LAogICAgICAgICJUT1RfRE9MTEFSX1NBTEVTIjogMTk5MS4wLAogICAgICAgICJUT1RfVU5JVF9TQUxFUyI6IDQ0LjAsCiAgICAgICAgIlRPVF9DT1NUIjogMTYxOC4xMDM3MDAwMDAwMDA2LAogICAgICAgICJHUk9TU19ET0xMQVJfU0FMRVMiOiAxOTkxLjAKICAgIH0KXQ =='
如果我将其复制到base64解码器中,我会在开头删除b'以及最后一个单引号之前得到胡言乱语。我认为那些导致我的请求失败。但是,根据这一说明,我认为b'会被忽略:What does the 'b' character do in front of a string literal?
我会感激任何建议。
谢谢。
答案 0 :(得分:1)
将bytes
对象传递到str
会导致它被格式化以便显示,它不会将字节转换为字符串(您需要知道要使用的编码):
In [1]: x = b'hello'
In [2]: str(x)
Out[2]: "b'hello'"
请注意,str(x)
实际上以b'
开头,以'
结尾。如果要将字节解码为字符串,请使用bytes.decode
:
In [5]: x = base64.b64encode(b'hello')
In [6]: x
Out[6]: b'aGVsbG8='
In [7]: x.decode('ascii')
Out[7]: 'aGVsbG8='
您可以安全地将base64字节解码为ASCII。此外,您的JSON应编码为UTF-8,而不是ASCII。以下更改应该有效:
j = json.dumps(dataDictList, indent=4, default=myconverter)
encodedData = base64.b64encode(j.encode('utf-8')).decode('ascii')