2016-03-12 58 views
1

嗯,我希望这是一个你以前没有看到的问题。非常奇怪的Python 3字节串错误

我这里粘贴代码:

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已经成功了一个字符串。但是如果你真的运行它,你应该得到'Basic'+ encoded_login作为字节错误。

以下是错误我得到:

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

如何有趣,什么叫神奇!字符串concat +已被转换为字节串联。你回购这个,你能分享你的想法是什么原因?

由于

回答

2

的binascii.b2a_base64功能追加一个新行到其输出:所述docs状态:

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

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

使用base64 module函数(例如base64.b64encode)来避免添加换行符。