2016-03-12 47 views
1

我写了soap服务器,soap客户端和wsdl文件。当我调用一个函数时,soap服务器无法识别输入。有人可以帮我解决这个问题。PHP SOAP服务器无法读取输入值(返回empy)?

WSDL文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/accounts/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="accounts" targetNamespace="http://www.example.org/accounts/"> 
    <wsdl:types> 
    <xsd:schema targetNamespace="http://www.example.org/accounts/"> 
     <xsd:element name="addAcount"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="firstName" type="xsd:string" /> 
      <xsd:element name="lastName" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="addAcountResponse"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="out" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="closeAccount"> 
     <xsd:complexType> 
      <xsd:sequence> 

       <xsd:element name="accountNumber" type="xsd:string"></xsd:element> 
       <xsd:element name="accountHolder" type="xsd:string"></xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="closeAccountResponse"> 
     <xsd:complexType> 
      <xsd:sequence> 

       <xsd:element name="status" type="xsd:string"></xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
    </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="addAcountRequest"> 
    <wsdl:part element="tns:addAcount" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="addAcountResponse"> 
    <wsdl:part element="tns:addAcountResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="closeAccountRequest"> 
    <wsdl:part name="parameters" element="tns:closeAccount"></wsdl:part> 
    </wsdl:message> 
    <wsdl:message name="closeAccountResponse"> 
    <wsdl:part name="parameters" element="tns:closeAccountResponse"></wsdl:part> 
    </wsdl:message> 
    <wsdl:portType name="accounts"> 
    <wsdl:operation name="addAcount"> 
     <wsdl:input message="tns:addAcountRequest"/> 
     <wsdl:output message="tns:addAcountResponse"/> 
    </wsdl:operation> 
    <wsdl:operation name="closeAccount"> 
     <wsdl:input message="tns:closeAccountRequest"></wsdl:input> 
     <wsdl:output message="tns:closeAccountResponse"></wsdl:output> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="accountsSOAP" type="tns:accounts"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="addAcount"> 
     <soap:operation soapAction="http://www.example.org/accounts/addAcount"/> 
     <wsdl:input> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    <wsdl:operation name="closeAccount"> 
     <soap:operation soapAction="http://www.example.org/accounts/closeAccount"/> 
     <wsdl:input> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation>  
    </wsdl:binding> 
    <wsdl:service name="accounts"> 
    <wsdl:port binding="tns:accountsSOAP" name="accountsSOAP"> 
     <soap:address location="http://localhost:8888/testing/wsdl/service.php"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

SOAP客户端,在SOAP客户端我试图访问关闭帐户功能。该功能有两个参数。

$wsdl = 'http://localhost:8888/testing/wsdl/service.php?wsdl'; 
$options = array('trace' => TRUE); 
$client = new SoapClient($wsdl, $options); 

$values = array(
     'accountNumber' => 'sdfsd', 
     'accountHolder' => 'sfsdf' 
    ); 

$response = $client->closeAccount($values); 

echo "<pre>"; 
print_r($response); 
echo "</pre>"; 

SOAP服务器,

class Exam { 

    function closeAccount($accountNumber, $accountHolder){ 
     $value = array('status'=>$accountNumber); 
     return $value; 
    } 

} 

$server = new SoapServer("http://localhost:8888/testing/wsdl/addAccount.wsdl"); 
$server->setClass('Exam'); 
$server->handle(); 

在SOAP服务器,当我尝试返回$使用accountNumber它显示数值名称 “对象”。如果我尝试访问$ accountHolder,它将返回空白。

为什么我的soap服务器无法读取输入值。请有人帮助我。

回答

0

客户端输入端接收到服务器“对象数组”因此,使用下面的方法来读取服务器,$阵列 - >账户持有价值

function closeAccount($array) { 
    $value = array('status' => $array->accountHolder); 
    return $value; 
} 
0

您传递功能的阵列,但是它期待两个不同的独立参数:

试试这个:

function closeAccount($array){ 
$value = array('status'=>$array['accountNumber']); 
    return $value; 
} 
+0

我曾尝试它不工作,这是输出, stdClass的对象 ( [状态] =>对象 ) – user3099298

+0

我尝试第二个选项,但它返回这个 “致命错误:未捕获的SOAPFault例外:SOAP-ENV:Server]不能使用类型为stdClass的对象作为排序” – user3099298

+0

$客户端是SoapClient类的实例化。 closeAccount函数属于考试类。 –