非常奇怪的Python 3 Byte to String失败

时间:2016-03-12 10:49:55

标签: python string python-3.x base64 byte

嗯,我希望这是你以前没见过的问题。

我在这里粘贴代码:

import binascii
import urllib.request
import urllib.parse
client_id = '2da9e3d6414047c0000000000' # a made up string
client_secret = 'fe5f334a1cf240000000000' # a made up string

url = 'https://accounts.spotify.com/api/token'
data = {'grant_type':'client_credentials'}
data = urllib.parse.urlencode(data)
login = client_id + ':' + client_secret
encoded_login = binascii.b2a_base64(login.encode('ascii'))
encoded_login = encoded_login.decode('utf-8')
print(encoded_login) ## so you know it is a string indeed

headers = {'Authorization': 'Basic ' + encoded_login}
try:
    req = urllib.request.Request(url, data.encode('ascii'), headers)
    with urllib.request.urlopen(req) as response:
        result = response.read()
except:
    raise Exception('some failure')   

我没有做任何改变,所以每个人都可以重现这个问题。现在您看到encoded_login已成功成为字符串。但如果你真的运行它,你应该得到基本的' + encoded_login作为字节错误。

这是我得到的错误:

Invalid header value b'Basic MmRhOWUzZDY0MTQwNDdjMDAwMDAwMDAwMDpmZTVmMzM0YTFjZjI0MDAwMDAwMDAwMA==\n'

多么有趣,多么神奇!字符串concat +已转换为字节连接。你回复这个,你能分享你的想法是什么原因吗?

谢谢

1 个答案:

答案 0 :(得分:2)

binascii.b2a_base64函数在其输出中附加换行符:docs状态:

  

将二进制数据转换为base64编码中的ASCII字符行。   返回值是转换后的行,包括换行符。该   添加了换行符,因为此函数的原始用例是   为它提供一系列57字节输入线以获得输出线   符合MIME-base64标准。

标头值中不允许使用换行符,这就是您收到错误消息的原因。该异常将标头值报告为字节,因为python http客户端代码将请求转换为字节以便通过网络传输。

使用base64 module函数 - 例如base64.b64encode - 以避免添加换行符。