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>

プロパティ「Key」と「Value」を持つ新しいクラス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

複雑な構造を渡すだけでいいと思います。

ここを見て:

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 に答える
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 に答える