用python请求替换curl等同于将文件发布到服务器

时间:2019-10-16 10:48:32

标签: python curl python-requests

使用下面的代码段编写文件后

    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可以使用同一台服务器。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您的python脚本可能没有什么问题。

我在curlrequests之间发现的差异如下:

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

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

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

例如:

  1. 打开终端
  2. 使用netcat命令启动nc -l -p 1234。这将在端口localhost上的1234上侦听HTTP请求,并将原始HTTP请求输出到终端。
  3. 将您的curl请求直接发送到另一个标签中的localhost:1234
  4. 执行python脚本,就像使用另一个标签中的URL localhost:1234
  5. 比较来自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很好地解释了。