我正在尝试构建一个简单的Web服务,并且正在运行。 我不知道我做错了什么,所以我无法获取soap服务器返回的值。
我的indexController里面有一个Zend_Soap_Server和一个Zend_Soap_Client:
class IndexController
extends Zend_Controller_Action
{
public function init()
{
$this->getHelper('viewRenderer')->setNoRender(true);
Zend_loader::loadFile( APPLICATION_PATH . '/../library/Web/Service.php' );
}
public function indexAction() {}
public function serverAction()
{
if( isset( $_GET['wdsl'] ) ) {
$server = new Zend_Soap_AutoDiscover();
$server->setClass('Web_Service');
$server->handle();
} else {
$options = array(
'soap_version' => SOAP_1_1 ,
'uri' => 'http://webservices.localhost/index/server?wdsl=1'
);
$server = new Zend_Soap_Server(null, $options);
$server->setClass('Web_Service');
$server->handle();
}
}
public function testAction()
{
$client = new Zend_Soap_Client(
'http://webservices.localhost/index/server?wdsl'
);
print( $client->getMessage() ) ;
}
}
一个非常简单的Service类传递给soap服务器:
class Web_Service
{
public function getMessage()
{
return 'ok';
}
}
当我请求我的肥皂服务器的URL时,它返回我猜应该返回的内容:
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://webservices.misterprint.com.br/index/server" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="Web_Service" targetNamespace="http://webservices.misterprint.com.br/index/server">
<types>
<xsd:schema targetNamespace="http://webservices.misterprint.com.br/index/server"/>
</types>
<portType name="Web_ServicePort">
<operation name="getMessage">
<documentation>getMessage</documentation>
<input message="tns:getMessageIn"/>
</operation>
</portType>
<binding name="Web_ServiceBinding" type="tns:Web_ServicePort">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getMessage">
<soap:operation soapAction="http://webservices.misterprint.com.br/index/server#getMessage"/>
<input>
<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://webservices.misterprint.com.br/index/server"/>
</input>
</operation>
</binding>
<service name="Web_ServiceService">
<port name="Web_ServicePort" binding="tns:Web_ServiceBinding">
<soap:address location="http://webservices.misterprint.com.br/index/server"/>
</port>
</service>
<message name="getMessageIn"/>
</definitions>
但是当我访问客户端的测试时,它什么都没打印出来!
如果我将getMessage方法的名称更改为例如getMessages,Zend会抛出异常:
Message: Function ("getMessages") is not a valid method for this service
我不知道我做错了什么。
提前致谢!
答案 0 :(得分:1)
你可能想先检查几件事,虽然我很感激你可能已经知道这个/已经完成了。
在开发SOAP服务时,除非您更改了任何默认设置,否则可能正在缓存WSDL。
您可能希望在相关环境设置下(例如正在开发中)将其添加到您的application.ini中。
phpSettings.soap.wsdl_cache_enabled = 0
这意味着你的WSDL不会被缓存,你可以排除前面的任何问题 - 尽管你说你的WSDL确实看到了你试图使用的方法。
同样,当使用ZF自动生成WSDL时,您将需要向方法添加基本注释,以便ZF WSDL生成器可以选择它们,例如添加任何@param和@return信息。像这样:
/**
* @return string
*/
public function getMessage()
{
return 'ok';
}
完成后,尝试使用您的服务器方法执行不同的操作....尝试
public function serverAction()
{
$baseUrl = 'http://webservices.localhost/index/server';
if( isset( $_GET['wdsl'] ) ) {
$strategy = new Zend_Soap_Wsdl_Strategy_AnyType();
$server = new Zend_Soap_AutoDiscover($strategy);
$server->setUri($baseUrl);
$server->setClass('Web_Service');
$server->handle();
} else {
$server = new Zend_Soap_Server($baseUrl . '?wsdl');
$server->setClass('Web_Service');
$server->handle();
}
}