【发布时间】:2017-05-10 19:21:05
【问题描述】:
我正在尝试使用urllib3 在python3 中发送HTTP 请求。
这里是代码sn-p
request_body = {'grant_type':'password','username': username,'password': password}
request_headers = {'Content-Type' : 'application/x-www-form-urlencoded','Authorization': "hash string"}
http = urllib3.PoolManager()
response = http.request('POST', 'https://api/url/endpoint', headers=request_headers, body=request_body)
但是当我尝试执行它时,它会抛出以下错误。
TypeError: can't concat bytes to str
完整的追溯
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/Mubin/anaconda/lib/python3.6/site-
packages/urllib3/request.py", line 70, in request
**urlopen_kw)
File "/Users/Mubin/anaconda/lib/python3.6/site-
packages/urllib3/request.py", line 148, in request_encode_body
return self.urlopen(method, url, **extra_kw)
File "/Users/Mubin/anaconda/lib/python3.6/site-
packages/urllib3/poolmanager.py", line 321, in urlopen
response = conn.urlopen(method, u.request_uri, **kw)
File "/Users/Mubin/anaconda/lib/python3.6/site-
packages/urllib3/connectionpool.py", line 600, in urlopen
chunked=chunked)
File "/Users/Mubin/anaconda/lib/python3.6/site-
packages/urllib3/connectionpool.py", line 356, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/Users/Mubin/anaconda/lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Users/Mubin/anaconda/lib/python3.6/http/client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Users/Mubin/anaconda/lib/python3.6/http/client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Users/Mubin/anaconda/lib/python3.6/http/client.py", line 1064, in _send_output
+ b'\r\n'
谁能指出我做错了什么?
编辑
request_body 类型检查
>>> type(request_body)
<class 'dict'>
>>> type(request_body['username'])
<class 'str'>
>>> type(request_body['password'])
<class 'str'>
>>> type(request_body['grant_type'])
<class 'str'>
【问题讨论】:
-
username和password的类型有哪些? -
都是字符串
<class 'str'> -
你 100% 确定吗?似乎消息正文中的某些内容是字节字符串
-
是的,100% 确定,
>>> type(request_body) <class 'dict'> >>> type(request_body['username']) <class 'str'> >>> type(request_body['password']) <class 'str'> >>> type(request_body['grant_type']) <class 'str'> -
我认为您在 POST 中没有正确使用
request()。查看the documentation。我认为您的 request_body 应该是fieldsarg
标签: python python-3.x urllib3