将Base64编码数据合并到Python Web Service调用中

时间:2017-11-16 21:40:52

标签: python-3.x rest web-services post encoding

我正在尝试在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?

我会感激任何建议。

谢谢。

1 个答案:

答案 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')