ZF 1.9.6 zend_soap: Function ( “doString”) não é um método válido para este serviço
-
19-09-2019 - |
Pergunta
Duplicate de esta questão
Eu estou tentando trabalhar com Zend_Soap usando Zend Framework 1.9.6 e PHP 5.3.1.
soap.php (gerador de WSDL)
<?php
require_once('Zend/Soap/Server.php');
require_once('Zend/Soap/AutoDiscover.php');
require_once('Soaping.php');
$_WSDL_URI="http://server/soap/soap.php?wsdl";
if(isset($_GET['wsdl'])) {
hadleWSDL();
} else {
handleSOAP();
}
function hadleWSDL() {
$autodiscover = new Zend_Soap_AutoDiscover();
$autodiscover->setClass('Soaping');
$autodiscover->handle();
}
function handleSOAP() {
global $_WSDL_URI;
$soap = new Zend_Soap_Server($_WSDL_URI);
$soap->setClass('Soaping');
$soap->handle();
}
Soaping.php (classe de serviço web)
<?php
class Soaping {
/**
*
* @param string $str
* @return string
*/
function doString($str) {
return $str;
}
}
client.php - cliente
<?php
require_once('Zend/Soap/Client.php');
$_WSDL_URI="http://server/soap/soap.php?wsdl";
$client = new Zend_Soap_Client($_WSDL_URI);
$client->doString('aaa');
quando eu executar o arquivo client.php eu recebo o erro:
Fatal error: Uncaught SoapFault exception: [Sender] Function ("do_math") is not a valid method for this service in /usr/local/ZendFramework-1.9.6/library/Zend/Soap/Client.php:1090 Stack trace: #0 /usr/local/ZendFramework-1.9.6/library/Zend/Soap/Client.php(1090): SoapClient->__soapCall('do_math', Array, NULL, NULL, Array) #1 [internal function]: Zend_Soap_Client->__call('do_math', Array) #2 /home/ufk/Projects/xpogames-development/xpo/soap/client.php(6): Zend_Soap_Client->do_math(1, 1) #3 {main} thrown in /usr/local/ZendFramework-1.9.6/library/Zend/Soap/Client.php on line 1090
xml que é criado, seguindo o link http:? //Server/soap/soap.php wsdl
<?xml version="1.0"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xpogames/soap/soap.php" 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="Soaping" targetNamespace="http://xpogames/soap/soap.php"><types><xsd:schema targetNamespace="http://xpogames/soap/soap.php"/></types><portType name="SoapingPort"><operation name="doString"><documentation>do string</documentation><input message="tns:doStringIn"/><output message="tns:doStringOut"/></operation></portType><binding name="SoapingBinding" type="tns:SoapingPort"><soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/><operation name="doString"><soap:operation soapAction="http://xpogames/soap/soap.php#doString"/><input><soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://xpogames/soap/soap.php"/></input><output><soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://xpogames/soap/soap.php"/></output></operation></binding><service name="SoapingService"><port name="SoapingPort" binding="tns:SoapingBinding"><soap:address location="http://xpogames/soap/soap.php"/></port></service><message name="doStringIn"><part name="str" type="xsd:string"/></message><message name="doStringOut"><part name="return" type="xsd:string"/></message></definitions>
i ver que a função existe no xml, por que não posso usá-lo?
actualizar
se eu adicionar a seguinte função à classe:
/ **
* Add método
*
* @Param Int $ param1
* @Param Int $ param2
* @Return Int
* / Tablet
função pública math_add ($ param1, param2 $) {
retornar $ param1 + $ param2;
}
esta função é reconhecido. Mas mesmo se eu mudá-lo para add_math2 (), a função não é reconhecido novamente.
Solução
ok parece que php em cache pela primeira vez eu criei um arquivo WSDL e não recriá-lo.
caching sabão pode ser desativado pela directiva php soap.wsdl_cache_enabled = 0
Outras dicas
Você deve adicionar comentário para a função única, em seguida, declarar entrada de parâmetro, saída. Exemplo:
/**
* Add method
*
* @param Int $param1
* @param Int $param2
* @return Int
*/