1

在我的 SoapClient 中,请求 XML 应该如下所示:

<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
<SOAP-ENV:Body>
    <SoapFunction xmlns="http://services.***/">
        <prop1>value1</prop1>
        <prop2>value2</prop2>
        <prop3>
            <KeyValuePair>
                <Key>string</Key>
                <Value>string</Value>
            </KeyValuePair>
            <KeyValuePair>
                <Key>string</Key>
                <Value>string</Value>
            </KeyValuePair>
        </prop3>
    </SoapFunction>
</SOAP-ENV:Body>
</sSOAP-ENV:Envelope>

我可以通过以下代码正确构建 prop1 和 prop2:

$parameters = array(
    'prop1' => value1,
    'prop2' => value2
);
$request = array($parameters);
$client->__soapCall('SoapFunction', $request);

但是我如何构建属性 prop3,尤其是构建在 WSDL 文件中定义的类型KeyValuePair

4

3 回答 3

1

根据 WSDL 文件中的定义

<s:complexType name="KeyValuePair">
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="Key" type="s:string" />
        <s:element minOccurs="0" maxOccurs="1" name="Value" type="s:string" />
    </s:sequence>
</s:complexType>

我创建了一个具有“键”和“值”属性的新类 KeyValuePair。然后我可以像这样使用 SoapVar 作为 prop3

$kvp1= new SoapVar(new KeyValuePair('key1', 'value1'), XSD_ANYTYPE, 'KeyValuePair');
$kvp2= new SoapVar(new KeyValuePair('key2', 'value2'), XSD_ANYTYPE, 'KeyValuePair');
$parameters = array(
    'prop1' => value1,
    'prop2' => value2,
    'prop3' => array($kvp1, $kvp2)
);
$request = array($parameters);
$client->__soapCall('SoapFunction', $request);

顺便说一句:如果生成的请求 xml 与您想要的有细微差别,您可以覆盖 SoapClient 的 __doRequest 以执行一些 preg_replace 等。

于 2012-08-07T01:17:20.767 回答
0

您可以像这样生成您的 XML 字符串,然后将其传递给您的 soapFunction

<?php
$prop1="prop1 value";
$prop2="prop2 value";
$prop3Values=array();
$prop3Values["key1"]="value1";
$prop3Values["key2"]="value2";
$prop3Values["key3"]="value3";
$prop3Values["key3"]="value3";
$prop3=="";

foreach($prop3Values as $k=>$v)
{
if($prop3=="")
{
$prop3.="<KeyValuePair> 
        <Key>$k</Key> 
        <Value>$v</Value> 
    </KeyValuePair>";
}
else
{
    $prop3.="
    <KeyValuePair> 
        <Key>$k</Key> 
        <Value>$v</Value> 
    </KeyValuePair>";
}
}

$xml=<<<XML
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"> 
<SOAP-ENV:Body> 
<SoapFunction xmlns="http://services.***/"> 
    <prop1>$prop1</prop1> 
    <prop2>$prop2</prop2> 
    <prop3> 
    $prop3
    </prop3> 
</SoapFunction> 
</SOAP-ENV:Body> 
</sSOAP-ENV:Envelope>
XML;
echo $xml;
?>

在变量 $xml 是您的格式化字符串

于 2012-08-06T08:12:39.630 回答
0

我认为你可以通过复杂的结构。

看这里:

https://stackoverflow.com/questions/2608626/how-to-send-an-array-of-complex-type-in​​-php-using-soap-client

PHP 可以翻译该调用中的复杂结构。

于 2012-08-06T08:14:28.817 回答