2

我正在尝试开发一个 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 来做到这一点。

4

0 回答 0