Webサービスを開発しようとしていますが、WSDLを生成できるYiiPHPフレームワークを使用しています。次の形式のコードを使用する、動作するPHPクライアントがあります。
<?php
$wsdlURL='someUrl';
$client = new SoapClient($wsdlURL);
$inputArray = array('a'=>'1', 'b'=>'2');
// make the actual soap call
$client->someMethod($inputArray);
これにより、次の形式のリクエストが生成されます。
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:SystemsControllerwsdl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://xml.apache.org/xml-soap" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:someMethod>
<inputArray xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">a</key>
<value xsi:type="xsd:string">1</value>
</item>
<item>
<key xsi:type="xsd:string">b</key>
<value xsi:type="xsd:string">2</value>
</item>
</inputArrayArray>
</ns1:someMethod>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
私は今Pythonで同じことをしようとしていて、SOAPpyを使用しています。これは難しい要件ではありません。機能しているように見えるのはSOAPライブラリだけです。( WSDLを解析するためのsudを取得できませんでした。)
いずれにせよ、私はこのpythonを持っています:
import SOAPpy
wsdlURL = 'someURL'
client = SOAPpy.WSDL.Proxy(wsdlURL)
args = {'a':'1', 'b':'2'}
soap_map = []
for key in args:
inner = {"key":key,"value":args[key]}
soap_map.append(inner)
wsdl.someMethod(soap_map)
リクエストは終了しましたが、代わりに次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:someMethod xmlns:ns1="urn:SystemsControllerwsdl" SOAP-ENC:root="1">
<v1 xmlns:ns2="http://soapinterop.org/xsd" SOAP-ENC:arrayType="ns2:SOAPStruct[6]" xsi:type="SOAP-ENC:Array">
<item>
<value xsi:type="xsd:string">1</value>
<key xsi:type="xsd:string">a</key>
</item>
<item>
<value xsi:type="xsd:string">2</value>
<key xsi:type="xsd:string">b</key>
</item>
</v1>
</ns1:someMethod>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
このリクエストが生成される名前空間が異なるため、私のWebサービスは入力の処理方法を認識していないと思います。Python経由で送信するときに、タイプを正しい名前空間に変更できればと思いますが、SOAPpyを使用してこれを行う方法がわかりませんでした。