将 curl 替换为相当于将文件发布到服务器的 python 请求



使用以下代码段编写文件后

with open("temp.trig", "wb") as f:
f.write(data)

我使用curl将其加载到服务器中

curl -X POST -F file=@"temp.trig" -H "Accept: application/json" http://localhost:8081/demo/upload

这工作正常。

我正在尝试用python请求替换curl,如下所示:

with open("temp.trig", "rb") as f:
result = requests.post("http://localhost:8081/demo/upload", files={'file': f},  
headers = {"Accept": "application/json"})

它试图尽可能密切地跟踪curl。 此代码会导致服务器出现错误 500。 我怀疑它一定与请求有关,因为同一个服务器通过'curl'是可以的。 有什么想法吗?

您的python脚本可能没有任何问题。

我注意到curlrequests之间的差异如下:

  • 显然,User-Agent标题是不同的 —curl/7.47.0python-requests/2.22.0
  • 标头Content-Type多部分边界格式不同 —------------------------6debaa3504bbc177curlc1e9f4f617de4d0dbdb48fcc5aab67e0requests
  • 因此Content-Length价值几乎肯定会有所不同
  • 正文中的multipart/form-data格式略有不同 —curl文件内容之前添加了额外的一行 (Content-Type: text/plain(

因此,根据您的文件格式,服务器可能无法解析requestsHTTP 请求格式。

我认为现在最适合您的解决方案是比较来自curlrequests的原始HTTP请求,并找出显着的差异。

例如:

  1. 打开终端
  2. 使用nc -l -p 1234命令启动netcat。这将侦听端口1234localhost上的 HTTP 请求,并将原始 HTTP 请求输出到终端。
  3. 按原样发送curl请求,以便在另一个选项卡中localhost:1234
  4. 执行python脚本,因为它在另一个选项卡中使用 URLlocalhost:1234
  5. 比较netcat输出中的原始请求

这是我的尝试:

import requests
headers = {
'Accept': 'application/json',
}
files = {
'file': ('temp.trig', open('temp.trig', 'rb')),
}
response = requests.post('http://localhost:8081/demo/upload', headers=headers, files=files)

如果这不起作用,我们真的需要在服务器端读取更多数据,正如Ivan Vinogradov解释得很好的那样。

最新更新