2012-10-10 64 views
0

我一直在試圖安裝使用Zend_Soap_Server SOAP服務器,但我似乎無法使它工作。
我已經嘗試了幾種不同的環境:在linux vm上的nginx和apache,在windows上的apache,php 5.3和php 5.4,都產生了相同的結果。(Zend公司)Soap服務器沒有返回結果

使用Zend_Soap_Autodiscover它正確地產生WSDL。當我將該wsdl提供給SoapClient並調用其上的方法時,它不會返回響應。看起來像SoapServer :: handle()被調用後停止。

這是服務器部分:

ini_set('soap.enable_wsdl_cache', 0); 

require_once 'Zend/Soap/AutoDiscover.php'; 
require_once 'Zend/Soap/Server.php'; 

if (isset($_GET['wsdl'])) { 
    handleWsdl(); 
} else { 
    handleSoap(); 
} 

function handleWsdl() { 
    $autodiscover = new Zend_Soap_AutoDiscover(); 
    $autodiscover->addFunction('pi'); 
    $autodiscover->handle(); 
} 

function handleSoap() { 
    $soap = new Zend_Soap_Server('http://localhost/experiments/soap/server.php?wsdl'); 
    $soap->setWsdlCache(false); 
    $soap->addFunction('pi'); 
    $soap->handle(); 
} 

這是客戶端:

ini_set('soap.enable_wsdl_cache', 0); 

$wsdl = 'http://localhost/experiments/soap/server.php?wsdl'; 
$client = new SoapClient($wsdl, array('trace' => 1)); 

$result = $client->pi(); 
var_dump($result); 

$resultNULL

我跑出來的想法,並希望有人能幫助我解開這個謎。

BTW:我也嘗試了SoapUI消耗的web服務,但結果是一樣的。

+0

好的,這可能很愚蠢,但是你有服務器端的名爲「pi」的實際功能? – Ivica

+0

php.net/pi,這是一個內置的功能:) –

+0

吧:) 好,爲什麼不換「PI()」起來「PI2()」或類似的東西,並添加在前面的一些基本警報/回聲/某事,那麼你至少可以在服務器端檢查你的代碼是從客戶端調用的...(即你可以驗證請求到達服務器的正確位置)。 另外,Zend_Soap_AutoDiscover使用PHP docblocks來確定通過soap返回的數據類型,也許pi()並不是那麼好描述? 也許返回值「PI()」也應該被包裹在一些SOAP信封,或提出一些stdClass的或東西... 只是想大聲... – Ivica

回答

0

也許我找到了問題。請檢查並報告您的投票是否正確。 我已經改叫使用選項,而不是主要的URI參數的肥皂,這樣的方式:

try{ 
     // initialize SOAP client 
     $options = array(
       'location' => 'http://localhost/experiments/soap/server.php', 
       'uri'  => 'http://localhost/experiments/soap/server.php' 
     ); 

     $client = new Zend_Soap_Client(null, $options); 
     $result = $client->pi(); 
     Zend_Debug::dump($result); 

    }catch(SoapFault $e){ 
     Zend_Debug::dump($e); 
     echo $e->getMessage(); 
    } 
} 

如果調用WSDL的客戶端不能稱之爲「PI()」方法。嘗試一下,讓我知道。

Regards