我如何哄骗PySimpleSOAP来形成像PHP的SoapClient这样的请求?

时间:2015-01-23 16:10:49

标签: python xml soap pysimplesoap

我正在编写一系列脚本来自动化ISPConfig(Web托管控制台)上的任务。你真的不需要了解这个问题,因为这个问题是关于形成XML的。原因......我想用Python而不是PHP来完成这个任务。我的第一个脚本的目的是为给定的域创建新的邮箱,我有一些现有的PHP代码可以解决。

事情进展顺利。尽管有一些简洁的文档,我还是得到了我的脚本与API进行通信以及发送参数的一点,pysimplesoap调用如下所示。

client = pysimplesoap.client.SoapClient(location=SOAP_LOCATION,
                                        namespace=SOAP_URI, trace=True)
response = client.login(username=console_login, password=console_pass)
session_id = str(response.children().children().children())
params = {
          'server_id': 1,
          'email': mailbox.mail_id,
          'login': mailbox.mail_id,
          'password': mailbox.mail_pass,
           # plus more params here ...
         }
response = client.mail_user_add(session=session_id,
                                client=client_id, params=params)
client.logout(session=session_id)

没有抛出任何错误,登录和注销工作正常,但是通过ISPConfig控制台检查,创建了一个完全空白的邮箱。同时,PHP中的相同调用会产生填充的邮箱。

在让两种语言向屏幕显示各自的回复和请求之后,问题就变得非常清楚......

对服务器的Python SOAP请求(使用上面的代码)

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n
<soap:Header/>\n
<soap:Body>\n    
    <mail_user_add xmlns="https://localhost:8080/remote/">\n  
    <session>8a7d6bc047a299974385f7e988570bc4</session>
    <params>
        <server_id>1</server_id>
        <email>someone@domain.com</email>
        <login>someone@domain.com</login>
        <blah>the rest of the params...</blah>
    </params>
    <client>0</client>
    </mail_user_add>\n
</soap:Body>\n
</soap:Envelope>

PHP SOAP服务器请求

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://66.212.164.9:8080/remote/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>
<ns1:mail_user_add>
<param0 xsi:type="xsd:string">b0048bd548a3062a3dbcbc49bc74a39c</param0>
<param1 xsi:type="xsd:int">0</param1>
<param2 xsi:type="ns2:Map">
    <item>
        <key xsi:type="xsd:string">server_id</key>
        <value xsi:type="xsd:int">1</value>
    </item>
    <item>
        <key xsi:type="xsd:string">email</key>
        <value xsi:type="xsd:string">someone@domain.com</value>
    </item>
    <item>
        <key xsi:type="xsd:string">login</key>
        <value xsi:type="xsd:string">someone@domain.com</value>
    </item>
    <item> ... </item>
</param2>
</ns1:mail_user_add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

好。该死的。我应该如何以上述格式制作pysimplesoap创建请求,以便API可以正确使用它们?

(除非出现这是一个绝望的案例,我正在使用来自https://github.com/pysimplesoap/pysimplesoap的更新的pysimplesoap 1.16以及python3)

PS看起来ISPConfig很遗憾不提供我刚刚开始阅读的称为WSDL的神秘文档。这可能很重要,并且将suds-jurko客户端排除在计划B之外,尽管它看起来也不错。 引用无WSDL:http://bugtracker.ispconfig.org/index.php?do=details&task_id=1273 引用不能使用suds:https://lists.fedoraproject.org/pipermail/suds/2010-February/000702.html

0 个答案:

没有答案