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
我正在 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