我正在编写一系列脚本来自动化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