使用以下代码段编写文件后
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
脚本可能没有任何问题。
我注意到curl
和requests
之间的差异如下:
- 显然,
User-Agent
标题是不同的 —curl/7.47.0
与python-requests/2.22.0
- 标头
Content-Type
多部分边界格式不同 —------------------------6debaa3504bbc177
curl
与c1e9f4f617de4d0dbdb48fcc5aab67e0
requests
- 因此
Content-Length
价值几乎肯定会有所不同 - 正文中的
multipart/form-data
格式略有不同 —curl
文件内容之前添加了额外的一行 (Content-Type: text/plain
(
因此,根据您的文件格式,服务器可能无法解析requests
HTTP 请求格式。
我认为现在最适合您的解决方案是比较来自curl
和requests
的原始HTTP请求,并找出显着的差异。
例如:
- 打开终端
- 使用
nc -l -p 1234
命令启动netcat
。这将侦听端口1234
上localhost
上的 HTTP 请求,并将原始 HTTP 请求输出到终端。 - 按原样发送
curl
请求,以便在另一个选项卡中localhost:1234
- 执行
python
脚本,因为它在另一个选项卡中使用 URLlocalhost:1234
- 比较
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解释得很好的那样。