我正在尝试开发一个 Web 服务,并且我正在使用 Yii PHP 框架,它可以生成 WSDL。我有一个可用的 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 库。(我无法获得suds来解析我的 WSDL。)
无论如何,我有这条蟒蛇:
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 来做到这一点。