我正在发布一个API,该API似乎坚持以名称(文件名?)xml的形式接收XML数据作为multipart / form-data。它可以在邮递员中工作,但是我无法使用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说,我永远不应该以这种方式明确定义标题。但是邮递员代码有效,而我的代码无效。
有什么建议吗?
答案 0 :(得分:0)
我不知道这是否值得回答,或者我是否应该删除问题,但需要的是将文件命名为"xml"
而不是xml
。这样就可以了:
requests.post(callpro_url,
files={'xml':('"xml"',result)},
verify=False).text