使用下面的代码段编写文件后
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可以使用同一台服务器。有什么想法吗?
答案 0 :(得分:0)
您的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请求,并找出有什么显着差异。
例如:
netcat
命令启动nc -l -p 1234
。这将在端口localhost
上的1234
上侦听HTTP请求,并将原始HTTP请求输出到终端。curl
请求直接发送到另一个标签中的localhost:1234
python
脚本,就像使用另一个标签中的URL localhost:1234
netcat
输出的原始请求答案 1 :(得分:0)
这是我的尝试:
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很好地解释了。