【发布时间】:2018-07-02 18:27:36
【问题描述】:
我发布到一个似乎坚持以多部分/表单数据形式接收 XML 数据的 API(文件名?)xml。它在邮递员中工作,但我无法使用 Python 的请求来工作。这是我的 Python 代码(基于https://stackoverflow.com/a/24443309/1011724):
requests.post(callpro_url,
files={'xml':('data.xml',result)},
verify=False).text
其中result 是一个包含XML 的字符串。如果我尝试此代码,我会得到响应:
xml 帖子字段为空
如果您不使用 multipart/form-data 标头,此 API 会给出响应。
如果我从工作邮递员的帖子中生成代码,我会得到类似这样的内容(略作编辑):
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 中执行此代码,它会给出正确的响应。
请注意,邮递员代码中的 params=querystring 部分在我的代码中的 URL 中得到处理。
我对邮递员代码中的有效负载感到困惑。它在字符串中添加诸如 Content-Disposition 和 name 之类的内容。我假设我可以将这些东西放在 files 参数的元组中,但我不知道该怎么做。例如,我尝试过 files={'xml':('data.xml',result,'form-data')} 以及 files={'xml':('data.csv',result)} 和 {'xml':('xml',result)}。
另外,邮递员代码明确将标头定义为
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
而requests documentation 说我永远不应该以这种方式明确定义标题。但是邮递员代码有效,而我的代码无效。
有什么建议吗?
【问题讨论】:
标签: python python-3.x post python-requests multipartform-data