我制作了一个简单的代码版本。它没有错误,但它根本不起作用。 (我为PHP启用了Soap)
具有功能的类:(Metodo.php)
class Teste {
/*
* @return string
*/
function SayHello() {
return "Hello, WORLD";
}
}
服务器:(Server.php)
<?php
require_once('Metodo.php');
if($_SERVER['QUERY_STRING'] == "wsdl") {
try {
require_once('Zend/Soap/AutoDiscover.php');
$wsdl = new Zend_Soap_AutoDiscover();
$wsdl->setClass('Teste');
$wsdl->handle();
}catch(exception $e) {
echo $e->getMessage();
}
} else {
$wsdl_url = sprintf('http://%s%s?wsdl', $_SERVER['HTTP_HOST'], $_SERVER['SCRIPT_NAME']);
require_once('Zend/Soap/Server.php');
$server = new SoapServer($wsdl_url);
$server->setClass('Teste');
$server->handle();
}
?>
客户:(Client.php)
<?php
require_once('Zend/Soap/Client.php');
$wsdl_url = "http://localhost:8090/WebService/Server.php?wsdl";
$client = new Zend_Soap_Client($wsdl_url);
try {
echo $client->SayHello();
echo ":)";
} catch (SoapFault $e) {
echo $e->getMessage();
}
?>
它只打印“:)”,没有错误,但它不会调用方法SayHello()。 如果有人愿意帮助我,我会非常感激。真。 非常感谢你。
答案 0 :(得分:4)
一些事情:
$server = new SoapServer($wsdl_url);
应该是:
$server = new Zend_Soap_Server($wsdl_url);
它可能没有,但由于你之前在Zend Soap Server类中需要,你也可以使用它。
在Server.php中:
$wsdl_url = sprintf('http://%s%s?wsdl', $_SERVER['HTTP_HOST'], $_SERVER['SCRIPT_NAME']);
确保此URL包含正确的端口(因为您使用的是端口8090)。如果HTTP_HOST与否,我记不清了。
然后最重要的是,在你的课堂上:
/*
* @return string
*/
function SayHello() {
return "Hello, WORLD";
}
应该是:
/**
* @return string
*/
function SayHello() {
return "Hello, WORLD";
}
注意评论开头的额外*。自动发现类使用PHPDoc块工作,必须以/ **开头才能生效。 (容易错过!)
如果在这些更改后仍然无效,请确保PHP没有缓存您的错误WSDL文件(默认情况下PHP缓存WSDL文件)。最简单的方法是从/ tmp /文件夹(或系统上的等效文件)中删除任何以'wsdl'开头的文件。进行这些更改后,我使用您的代码得到了正确的输出。
答案 1 :(得分:3)
某处应该记录错误。检查服务器和PHP日志。 SOAP客户端还有一些“跟踪/调试”设置。您可能会获得有关上次呼叫/响应的更多信息。
有了更多信息,这里有一些观察:
您是否尝试使用浏览器访问WSDL?它解决了吗?
freenodes'#zalkalk channel(IRC)也是一个很好的资源。如果你在那里找到答案,请回复这里。