使用python请求库将文件发布到服务器时出现错误请求

2024-05-21 09:16:10 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图使用python请求库向服务器发布文件时,我得到了http代码400(错误的请求)。在

相应的curl请求成功:

curl -X POST -i https://de.api.labs.sophos.com/analysis/file/static/v1 \
-H 'Authorization: auth_string' \
-H 'Content-Type: multipart/form-data' \
-F "file=@filename"

API文档:https://api.labs.sophos.com/doc/analysis/file/static.html

有人能帮我解决我可能做错了什么吗?
目前我的代码:

^{pr2}$

Tags: 文件代码https服务器comapihttp错误
1条回答
网友
1楼 · 发布于 2024-05-21 09:16:10

TL;DR

尝试以以下方式执行:

import requests

url = "https://de.api.labs.sophos.com/analysis/file/static/v1"
headers = {'Authorization': authorization}  # no Content-Type here

r = requests.post(url, headers=headers, files={"file": open(filepath, "rb")})
print(r.status_code, r.text)

为什么

posting files时,不应该手动设置^{cd1>}头^{{cd2>}。

原因有两个:

  • ^{cd2>}在发出实际HTTP请求之前,将^{{cd1>}隐式设置为^{{cd5>}(例如^{cd6>})
  • 使用^{cd7>}时,还应该指定boundary。如果未设置边界,服务器将无法正确读取请求主体中的数据。因此,如果使用^{{cd5>},边界是^{cd1>}头的必需部分。

在您的示例中,您没有为请求设置边界。事实上,^{cd2>}如果覆盖^{{cd1>}头(您可以这样做),则没有为您设置它。然后服务器无法读取请求正文中的文件。因此,它会返回^{{cd12>}。

您可以在提出请求后键入^{cd13>}来检查它。它将输出:

^{pr2}$

,但它必须这样:

^{pr3}$

另一方面,^{cd14>}隐式地添加边界,因此您一切都很好,您将收到^{cd15>}。

您也可以检查:

^{pr4}$

输出:

* Connected to httpbin.org (34.230.136.58) port 80 (#0)
> POST /post HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.47.0
> Content-Type: multipart/form-data; boundary=            d257f5f4377a3997
...

相关问题 更多 >