2016-03-12 51 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函數屬於考試類。 –