Python 3.6 urllib TypeError:can';t concat字节到str

Python 3.6 urllib TypeError:can';t concat字节到str,python,urllib,Python,Urllib,我正在尝试使用Python3.6中的urllib从API中提取一些JSON数据。它需要传递头信息以进行授权。这是我的密码: import urllib.request, json headers = {"authorization" : "Bearer {authorization_token}"} with urllib.request.urlopen("{api_url}", data=headers) as url: data = json.loads(url.read().de

我正在尝试使用Python3.6中的urllib从API中提取一些JSON数据。它需要传递头信息以进行授权。这是我的密码:

import urllib.request, json

headers = {"authorization" : "Bearer {authorization_token}"}

with urllib.request.urlopen("{api_url}", data=headers) as url:
   data = json.loads(url.read().decode())
   print(data)
我得到的错误信息是:

Traceback (most recent call last):
  File "getter.py", line 5, in <module>
with urllib.request.urlopen("{url}", data=headers) as url:
   File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
  File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 526, in open
response = self._open(req, data)
  File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 544, in _open
'_open', req)
  File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
  File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 1361, in https_open
context=self._context, check_hostname=self._check_hostname)
  File "AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", line 1318, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
  File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
  File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
  File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
  File "AppData\Local\Programs\Python\Python36-32\lib\http\client.py", line 1064, in _send_output
+ b'\r\n'
TypeError: can't concat bytes to str

Process finished with exit code 1
回溯(最近一次呼叫最后一次):
文件“getter.py”,第5行,在
使用urllib.request.urlopen(“{url}”,data=headers)作为url:
文件“AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py”,第223行,在urlopen中
返回opener.open(url、数据、超时)
文件“AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py”,第526行,打开
响应=自身打开(请求,数据)
文件“AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py”,第544行,打开
"开放",
文件“AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py”,第504行,在调用链中
结果=func(*args)
文件“AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py”,第1361行,https\u打开
上下文=self.\u上下文,检查主机名=self.\u检查主机名)
文件“AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py”,第1318行,打开
encode_chunked=req.has_头('Transfer-encoding'))
请求中第1239行的文件“AppData\Local\Programs\Python\Python36-32\lib\http\client.py”
self.\u发送\u请求(方法、url、正文、标题、编码\u分块)
文件“AppData\Local\Programs\Python\Python36-32\lib\http\client.py”,第1285行,在发送请求中
self.endheaders(body,encode\u chunked=encode\u chunked)
文件“AppData\Local\Programs\Python\Python36-32\lib\http\client.py”,第1234行,在endheaders中
self.\u发送\u输出(消息体,encode\u chunked=encode\u chunked)
文件“AppData\Local\Programs\Python\Python36-32\lib\http\client.py”,第1064行,在发送输出中
+b'\r\n'
TypeError:无法将字节连接到str
进程已完成,退出代码为1

不太确定这里出了什么问题,我没有输入任何字节,因此我不确定为什么会出现错误,告诉我无法将字节连接到str。

数据参数应该是类似字节的对象。您需要执行以下操作:

urllib.request.urlopen({api_url}, data=bytes(json.dumps(headers), encoding="utf-8"))

@马修温菲尔德,我已经和这个问题斗争过很多次了。事实上,这行代码是从我的一个项目中复制出来的。虽然我没有收到任何Django/Python错误,但使用POST数据进行的身份验证(可能不是最好的主意,但我无法更改它)失败了。另一方面,对于请求库,它可以工作(使用与POST数据相同的字典)。我认为应该使用
headers=headers