我正在尝试用Python 3进行web服务调用。请求的一个子集包括一个base64编码的字符串,该字符串来自Python字典列表。
所以我转储列表并对字符串进行编码:
j = json.dumps(dataDictList, indent=4, default = myconverter)
encodedData = base64.b64encode(j.encode('ASCII'))
然后,当我构建请求时,我会添加该字符串。因为它以字节为单位返回,我需要将其更改为字符串:
...
"data": "''' + str(encodedData) + '''"
...
我从web服务得到的响应是我的请求格式不正确。当我打印str(encodedData)时,我得到:
b'WOgICAgeWOgICAgICJEQVlfREFURSI6ICIyMDYLTMxIDAwOjAwIwKICAgICAgICAiQ0FMTF9DVFjfSUQiOiA1LAogICAgICJUT1RfRE9MTEFSX1NBTEVTIjogMTk5MS4wLAogICAg ICJUT1RF5JVF9TQUxFUy6IDQ0LjAsCiAgICAgICAgIlRPVF9DT1NUIjogMTYxOC4xMDM3MDAwMDAwA2LAogICAg2ICJH Uk9TU19ET0xMQVJfU0FMRVMiOiAxOTkxLjAKICAgIH0KXQ=='
如果我把它复制到base64解码器中,我就会胡言乱语,直到我删除了开头的b'和最后一个引号。我想是这些原因导致我的请求失败了。不过,根据这个注释,我认为b'被忽略了:;b';字符串文字前面的字符做什么?
如果有任何建议,我将不胜感激。
谢谢。
将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')