Разместите строку как multipart / form-data, используя запросы

1

Я отправляю в 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"

тогда как в документации по запросам утверждается, что я никогда не должен явно определять заголовки таким образом. Однако почтовый код работает, а мой код - нет.

Какие-либо предложения?

Теги:
python-requests
python-3.x
post
multipartform-data

1 ответ

0
Лучший ответ

Я не знаю, стоит ли отвечать на этот вопрос или если я должен удалить вопрос, но нужно было указать файл "xml" не xml. поэтому это работает:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню