PHP SOAP传递ComplexType参数

时间:2012-12-07 09:54:02

标签: php soap wsdl soap-client

我正试图从我的网络应用程序调用SOAP服务。我创建一个没有问题的soap客户端,但我遇到调用SOAP方法GetCustomer的问题。我得到了关注SOAP错误

SOAP-ERROR: Encoding: object hasn't 'any' property.

我认为问题在于提供的参数。参数类型为ComplexType,我不确定是否从PHP传递它。这是来自GetCustomer方法的WSDL:

<s:element name="GetCustomer">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="user" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="password" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="xmlParams">
                <s:complexType mixed="true">
                    <s:sequence>
                        <s:any/>
                    </s:sequence>
                </s:complexType>
            </s:element>
        </s:sequence>
    </s:complexType>
</s:element>

我发现this article解决了这个问题,当我将其应用于我的代码时,我得到了上述错误。这是我的PHP代码:

$params = new StdClass();
$params->user = '****';
$params->password = '****';
$params->xmlParams = new StdClass();

$soap_options = array('trace' => 1, 'exceptions'  => 1 );
$wsdl = "https://web-icdev.saop.si/iCenter_WS/SAOPWS_Customer.asmx?WSDL";
$client = new SoapClient($wsdl, $soap_options);

try {
    $result = $client->GetCustomer($params);
    var_dump($result);
} 
catch (SOAPFault $f) {
    echo $f->getMessage();
}

2 个答案:

答案 0 :(得分:2)

您必须创建3个文件:

1.GetCustomer.class.php

<?php 
class GetCustomer{ 
var $user; 
var $password;
var $xmlParams;
}

2.xmlParams.class.php

<?php 
class xmlParams{ 
}

2.ServiceConsumer.php

 <?php
 include_once 'GetCustomer.class.php';
 include_once 'xmlParams.class.php';

 $objGetCust = new GetCustomer();
 $objGetCust->user = '****';
 $objGetCust->password = '****';
 $objGetCust->xmlParams = new xmlParams();

 $soap_options = array('trace' => 1, 'exceptions'  => 1 );
 $wsdl = "https://web-icdev.saop.si/iCenter_WS/SAOPWS_Customer.asmx?WSDL";
 $client = new SoapClient($wsdl, $soap_options);

 try {
    $result = $client->GetCustomer($params);
    var_dump($result);
 }catch (SOAPFault $f) {
        echo $f->getMessage();
 }

这是我使用这些Web服务的方式,您也可以将GetCustomer和xmlParams类放在 ServiceConsumer.php 文件中,或者也可以将两者放在同一个文件中。

但我更喜欢在不同的文件中使用所有文件。

最诚挚的问候。

答案 1 :(得分:0)

试试这个:

$params = new StdClass();

$params->user = '****';

$params->password = '****';

$foo = new StdClass();

$foo->any = $yourXML;

$param->xmlParams = $foo;

$soap_options = array('trace' => 1, 'exceptions'  => 1 );

$wsdl = "https://web-icdev.saop.si/iCenter_WS/SAOPWS_Customer.asmx?WSDL";

$client = new SoapClient($wsdl, $soap_options);

try {
    $result = $client->GetCustomer($params);
    var_dump($result);
} 
catch (SOAPFault $f) {
    echo $f->getMessage();
}