Разместите строку как multipart / form-data, используя запросы - PullRequest
0 голосов
/ 02 июля 2018

Я отправляю сообщение в 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"

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

Есть предложения?

1 Ответ

0 голосов
/ 04 июля 2018

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

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