使用请求将字符串作为多部分/表单数据发布

时间:2018-07-02 18:27:36

标签: python python-3.x post python-requests multipartform-data

我正在发布一个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说,我永远不应该以这种方式明确定义标题。但是邮递员代码有效,而我的代码无效。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

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