【问题标题】:Post a string as multipart/form-data using requests使用请求将字符串作为 multipart/form-data 发布
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2012-04-21
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多