2012-10-10 61 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