如何解决python准备好的请求 - 删除不需要的标头
这个代码块有问题:
JavascriptExecutor
WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return arguments[0].shadowRoot",driver.findElement(By.xpath("//input[value = 'Choose File']")));
element.sendKeys("some keys");
已从 PreparedRequest 标头中正确删除,但是在 with requests.Session() as s:
_hs = s.headers
req = requests.Request('POST',url,data=json.dumps(data),headers=headers)
prepared_req = req.prepare()
if 'Content-Length' in prepared_req.headers:
prepared_req.headers.pop('Content-Length')
rsp = s.send(prepared_req,timeout=self._TIMEOUT)
try:
rsp.raise_for_status()
except requests.HTTPError:
self._logger.exception("error in retrieving response from %s -- response content: %s",rsp.content)
raise
return rsp.json()
期间出现问题:
Content-Length
如果我用 send
删除标题,也会发生同样的事情:
Traceback (most recent call last):
File "/opt/projects/MyProj/my-http-client/my_http_client/http_client.py",line 297,in _http_post
rsp = s.send(prepared_req,timeout=self._TIMEOUT)
File "/home/user/venvs/my-http-client-venv/lib/python3.8/site-packages/requests/sessions.py",line 655,in send
r = adapter.send(request,**kwargs)
File "/home/user/venvs/my-http-client-venv/lib/python3.8/site-packages/requests/adapters.py",line 472,in send
low_conn.send(i)
File "/usr/lib/python3.8/http/client.py",line 975,in send
self.sock.sendall(d)
TypeError: a bytes-like object is required,not 'str'
有人知道怎么回事吗?没有 del
,一切运行正常。
解决方法
根据对相关 question 的回答,在 python3 中,默认情况下所有字符串都是 Unicode,但在通过网络发送时需要将其转换为字节。
我怀疑问题出在 data=json.dumps
行上,因为转储数据会将其转换为字符串而不是字节:
In [1]: data=json.dumps(dict(a='somestring'))
In [2]: data
Out[3]: '{"a": "somestring"}'
In [4]: type(data)
Out[5]: str
解决方案是将字符串编码为字节:
In [6]: data=json.dumps(dict(a='somestring')).encode('utf-8')
In [7]: data
Out[8]: b'{"a": "somestring"}'
In [9]: type(data)
Out[10]: bytes
,
试过了,现在我有了:
Traceback (most recent call last):
File "/home/user/venvs/my-app-venv/lib/python3.8/site-packages/requests/adapters.py",line 470,in send
low_conn.send(hex(len(i))[2:].encode('utf-8'))
TypeError: object of type 'int' has no len()
奇怪,在官方请求文档中,删除标题的方法似乎正是如此 https://docs.python-requests.org/en/master/user/advanced/#prepared-requests
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。