Matthew Winfield
Matthew Winfield

Reputation: 967

Python 3.6 urllib TypeError: can't concat bytes to str

I'm trying to pull some JSON data from an API using urllib in Python 3.6. It requires header information to be passed for authorization. Here is my code:

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)

And the error message I get:

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

Not too sure what's going wrong here, I'm not inputting any bytes so I'm not sure why I'm getting an error telling me I can't concat bytes to str.

Upvotes: 22

Views: 29612

Answers (1)

Nick Chapman
Nick Chapman

Reputation: 4634

The data argument is expected to be a bytes-like object. you need to do the following:

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

Upvotes: 29

Related Questions