Post 字符串作为 multipart/form-data 使用请求

Post a string as multipart/form-data using requests

我正在 posting 到 API,它似乎坚持接收 XML 数据作为 multipart/form-data 名称(文件名?)xml.它在 postman 中工作,但我无法使用 Python 的请求让它工作。这是我的 Python 代码(基于 ):

requests.post(callpro_url,
              files={'xml':('data.xml',result)},
              verify=False).text

其中 result 是一个包含 XML 的字符串。如果我尝试此代码,我会得到响应:

xml post field is empty

这是 API 如果您不使用 multipart/form-data header.

给出的响应

如果我从正在工作的 postman post 生成代码,我会得到这样的结果(略微编辑):

import requests

url = "https://blablabla.blablab.com/blabla/api.php"

querystring = {"mode":"import","hash":"redacted-hash","xml":"\"xml\""}

payload = "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"xml\"\r\n\r\n<?xml version=\"1.0\" ?>\n<importdata>\n --redacted-XML-- \n</importdata>\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--"
headers = {
    'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
    'cache-control': "no-cache",
    'postman-token': "8d3ec8ee-784e-3a65-5240-cf1a9534d1c4"
    }

response = requests.request("POST", url, data=payload, headers=headers, params=querystring)

print(response.text)

在 Python 中执行这段代码,它给出了正确的响应。

请注意,postman 代码中的 params=querystring 部分已在我的代码中的 URL 中处理。

我对 postman 代码中的负载感到困惑。它在字符串中添加 Content-Disposition 和名称之类的内容。我假设我可以将这些东西放在 files 参数的元组中,但我不确定该怎么做。例如,我尝试了 files={'xml':('data.xml',result,'form-data')} 以及 files={'xml':('data.csv',result)}{'xml':('xml',result)}.

此外,postman 代码将 header 明确定义为

 'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"

requests documentation 说我永远不应该以这种方式明确定义 header。但是 postman 代码有效,而我的代码无效。

有什么建议吗?

我不知道这是否值得回答,或者我是否应该删除这个问题,但需要的是将文件命名为 "xml" 而不是 xml。所以这有效:

requests.post(callpro_url,
              files={'xml':('"xml"',result)},
              verify=False).text