Хорошо, это потребовало много проб и ошибок, чтобы выяснить правильные части здесь, но я наконец понял это. Ответ @Brennen Sprimont очень помог в понимании того, что делал cURL.
Как он указал - cURL фактически отправлял полный файл, а мои первоначальные запросы не были.
Моя первая подсказка пришла с сайта, который я нашел, который конвертирует команды cURL в python - Ссылка
Когда я поместил свою команду cURL на этот сайт, она вернула это как часть результата:
data = {'reqxml' : (None, open(xml_file, 'rb'))}
( примечание: в своем вопросе я использовал 'x', но здесь я использовал 'data' для этой переменной )
Параметр None
отсутствовал в моем оригинале - также я сейчас читаю двоичный файл.
Моя следующая главная проблема заключалась в том, как я передавал файл - когда я выполняю это из браузера, синтаксис:
https://<ipaddress><port>/webconsole/APIController?reqxml=<Login></Login>
Здесь мы можем видеть данные, определенные атрибутом reqxml=
В cURL это выглядит следующим образом:
curl -k https://10.244.1.2:4444/webconsole/APIController? -F "reqxml=MYxml.xml"
Там мы можем указать, что атрибут фактически не передается в URL, а с файлом
Последней ошибкой, которую я сделал, была попытка передать атрибут reqxml
со знаком '='. В отличие от cURL или через браузер, запросы не хотят этого. В этом случае он хотел, чтобы значения передавались в виде словаря без символа равенства.
Ниже приведена небольшая функция, которую я использовал для тестирования и работает с Sophos XG v17
data_file = 'Myxml.xml'
ipaddress = '10.244.1.2'
def api_call(api_ip, xml_file):
api_url = r'https://{}:4444/webconsole/APIController?'.format(api_ip)
data = {'reqxml' : (None, open(xml_file, 'rb'))}
r = requests.post(api_url, files=data, verify=False)
print(r.text)
api_call(ipaddress, data_file)