Chr*_*n H 5 python tcp python-requests
我正在尝试使用 python 编写 HTTP POST 请求脚本。
使用 bash 中的 curl 尝试它时,一切正常。使用 python,使用 therequests或urllib3-library,我收到来自 API 的错误响应。POST 请求包含标头中的信息和请求正文中的 json。
我注意到,当我用 Wireshark 拦截数据包时,curl 请求(正在工作)是一个长度为 374 字节的数据包。python-request(这里requests和urllib3这里没有区别)被分成 2 个单独的数据包,长度分别为 253 和 144 字节。
Wireshark 可以毫无问题地重新组装它们,它们似乎都在标题和 POST 正文中包含完整信息。但是我试图通过一个不是很有帮助的“处理请求时出错”的 API 连接到答案。
由于 253 字节不能成为 TCP 数据包的限制,这种行为的原因是什么?有没有办法解决这个问题?
编辑:
重击:
curl 'http://localhost/test.php' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' -H 'Content-Type: application/json' -d '{"key1":"value1","key2":"value2","key3":"value3"}'
Run Code Online (Sandbox Code Playgroud)
Python:
import requests, json
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
"Content-Type": "application/json"}
data = {"key1":"value1", "key2":"value2", "key3":"value3"}
r=requests.post("http://localhost/test.php", headers=headers, data=json.dumps(data))
Run Code Online (Sandbox Code Playgroud)
TCP 是一个数据流,而不是一系列消息。将数据流分段为数据包应该与数据流的解释无关,无论是发送者还是接收者。如果接收者实际上根据数据包的分段表现不同,则接收者已损坏。
虽然我见过这样损坏的系统,但我也见过更多的系统由于不同的原因而不喜欢该请求,例如错误的用户代理、缺少接受标头或类似的情况。我建议您先检查一下,然后再得出结论,这一定是数据流的分段。
至于为什么curl和requests的行为不同:可能curl首先构造完整的请求(标头和正文)并发送它,而requests首先构造标头并发送它,然后发送正文,即执行两次写入操作,这可能会导致两个数据包。