Программно вызывать методы RPC для конечной точки SOAP в python

Я ищу простой способ программно вызывать вызов SOAP/RPC через Python. Что-то вроде:

method_to_invoke, args = parse_user_input()
outbound_xml = library.call_remote_method(method_to_invoke, args)
result = requests.post(... data=outbound_xml)

Я знаю, что несколько библиотек Python, поддерживающих вызовы SOAP/RPC; однако все они делают "волшебство" и допускают такие вещи, как:

result = client.service.getPercentBodyFat('jeff', 68, 170)

(предыдущий пример взят из suds documentation, но основные принципы одинаковы). Это предполагает, что я знаю имя метода раньше времени и не могу определить его во время выполнения.

В поисках решений они либо больше не поддерживаются, либо пытаются сделать слишком много "магии". Например, см. этот сложный soution или это решение, которое в основном "Создайте свой собственный XML и отправьте его над".

Есть ли какая-нибудь библиотека, которая может построить для меня "исходящий" XML без необходимости проходить обручи? У меня уже есть HTTP-сервер, который получит входящий RPC и захочет использовать requests для правильной обработки таких вещей, как проверка сертификата SSL.

Ответ 1

Вы можете дать шанс python-zeep (http://docs.python-zeep.org). Он может легко сгенерировать xml, который вы хотите отправить через следующий код:

client = zeep.Client(
    wsdl='http://www.webservicex.net/ConvertSpeed.asmx?WSDL')
doc = client.service._binding.create_message('ConvertSpeed', 100, 
      'kilometersPerhour', 'milesPerhour'))    
print(etree.tostring(doc, pretty_print=True))

(Я автор, поэтому дайте мне знать, если у вас есть проблемы с этим)