Я отправляю сообщение в API, который, похоже, настаивает на получении XML-данных в виде multipart / form-data с именем (имя файла?) Xml. Это работает в почтальоне, но я не могу заставить его работать, используя запросы Python. Это мой код Python (на основе https://stackoverflow.com/a/24443309/1011724):
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 и name в строку. Я предполагаю, что могу поместить этот материал в кортеж в параметре files
, но я не уверен, как это сделать. Я пробовал files={'xml':('data.xml',result,'form-data')}
например, а также files={'xml':('data.csv',result)}
и {'xml':('xml',result)}
.
Кроме того, код почтальона явно определяет заголовок как
'content-type': "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
, тогда как запрашивает документацию , что я никогда не должен явно определять заголовки таким образом. Однако код почтальона работает, а мой код - нет.
Есть предложения?