Web ホスティング コンソールである ISPConfig のタスクを自動化する一連のスクリプトを作成しています。この質問は XML の形成に関するものなので、実際に知る必要はありません。... 理由 ... PHP ではなく Python でこのタスクを実行したいと考えています。私の最初のスクリプトの目的は、特定のドメイン用の新しいメールボックスを作成することであり、作業する既存の 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 create リクエストを作成して、API で適切に使用できるようにするにはどうすればよいですか?
(それが明らかにならない限り、それは絶望的なケースです。私はhttps://github.com/pysimplesoap/pysimplesoapから更新された pysimplesoap 1.16 を使用していますまた、python3)
PS 残念ながら、ISPConfig は、私が読み始めたばかりの WSDL として知られる不思議なドキュメントを提供していないようです。これはおそらく知っておくことが重要であり、プラン B として suds-jurko クライアントを除外しますが、これも見栄えがします。WSDL を引用しない: http://bugtracker.ispconfig.org/index.php?do=details&task_id=1273 suds を使用できないと引用する: https://lists.fedoraproject.org/pipermail/suds/2010-February/000702. html