Я отправляю в API, который, кажется, настаивает на получении XML-данных как multipart/form-data с именем (имя файла?) Xml. Он работает в почтальоне, но я не могу заставить его работать с использованием запросов Python. Это мой код Python (на основе qaru.site/questions/971399/...):
requests.post(callpro_url,
files={'xml':('data.xml',result)},
verify=False).text
где result
- строка, содержащая XML. Если я попробую этот код, я получаю ответ:
пустое поле xml пусто
это ответ, который дает этот API, если вы не используете заголовок multipart/form-data.
Если я создаю код из рабочего почта почтальона, я получаю что-то вроде этого (слегка отредактированный):
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 и имя в строке. Я предполагаю, что я могу поместить этот материал в кортеж в параметр files
но я не уверен, как это сделать. Я пробовал files={'xml':('data.xml',result,'form-data')}
например, а также files={'xml':('data.csv',result)}
и {'xml':('xml',result)}
.
Кроме того, код почтальона явно определяет заголовок как
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
тогда как в документации по запросам утверждается, что я никогда не должен явно определять заголовки таким образом. Однако почтовый код работает, а мой код - нет.
Какие-либо предложения?
Я не знаю, стоит ли отвечать на этот вопрос или если я должен удалить вопрос, но нужно было указать файл "xml"
не xml
. поэтому это работает:
requests.post(callpro_url,
files={'xml':('"xml"',result)},
verify=False).text