<p>在不知道将请求发送到哪个服务器的情况下很难确定,但我猜您的问题是在<code>data</code>和<code>files</code>参数中复制了<code>file</code>表单字段</p>
<p>当您在传递给<code>data</code>和<code>files</code>参数的dict中使用相同的键时,请求将对请求使用多部分编码,并使用来自这两个dict的数据</p>
<p>例如,当我在系统上尝试以下代码时:</p>
<pre><code>requests.post("http://localhost:8000", data={"file": "foo"}, files={"file": "bar"})
</code></pre>
<p>它转换为以下HTTP请求:</p>
<pre><code>POST / HTTP/1.1
Host: localhost:8000
User-Agent: python-requests/2.24.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 231
Content-Type: multipart/form-data; boundary=2756042e934999f01bd91212ac4ae994
2756042e934999f01bd91212ac4ae994
Content-Disposition: form-data; name="file"
foo
2756042e934999f01bd91212ac4ae994
Content-Disposition: form-data; name="file"; filename="file"
bar
2756042e934999f01bd91212ac4ae994-
</code></pre>
<p>在您的情况下,可能是服务器在HTTP请求中看到了第一个<code>file</code>表单字段,发现它没有<code>filename</code>属性,并决定拒绝格式错误的请求</p>
<p>相反,请尝试从<code>payload</code>字典中删除<code>file</code>键,以便在生成的HTTP请求中只有一个<code>file</code>表单字段</p>
<pre><code>import requests
url = "http://localhost:8080/rest/2.0/import/ejob"
payload = {
"deleteFile": "",
"simulation": "",
"fileName": "xyz",
"sheetName": "",
"headerRow": "",
"sendNotification": "",
"sheetIndex": "",
"fileId": "",
"template": ' [ { "resourceType": "Asset", "type": { "name": "xyz" }, "identifier": { "name": "${1}", "domain": { "name": "xyz", "community": { "name": "file" } } } } ]',
"batchSize": "10000",
}
files = {
"file": (
"import_file",
open("filename.xlsx", "rb"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
{"Expires": "0"},
)
}
headers = {
"accept": "application/json",
"Authorization": "Basic xyz",
"Content-Type": "multipart/form-data",
}
response = requests.post(url, headers=headers, data=payload, files=files)
</code></pre>
<hr/>
<p>顺便说一句,部分问题是您在Python <code>payload</code>dict的<code>file</code>键中使用了<code>@filename.xlsx</code>,但是<code>@</code>是一种特殊的curl语法,它在请求中包含指定文件的内容</p>
<p>从<a href="https://curl.se/docs/manpage.html" rel="nofollow noreferrer">curl man page</a>开始:</p>
<blockquote>
<p>-F, form <name=content></p>
<p>(HTTP SMTP IMAP) For HTTP protocol family, this lets curl emulate a filled-in form in which a user has pressed the submit button. This causes curl to POST data using the Content-Type multipart/form-data according to RFC 2388.</p>
<p>For SMTP and IMAP protocols, this is the mean to compose a multipart mail message to transmit.</p>
<p>This enables uploading of binary files etc. To force the 'content' part to be a file, prefix the file name with an @ sign. To just get the content part from a file, prefix the file name with the symbol <. The difference between @ and < is then that @ makes a file get attached in the post as a file upload, while the < makes a text field and just get the contents for that text field from a file.</p>
</blockquote>
<p>在请求库中,<code>@</code>没有这种效果;相反,它只是作为普通字符插入到请求中</p>