0

我制作了我的代码的简单版本。它没有给出任何错误,但它根本不起作用。(我为 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()。如果有人愿意帮助我,我将不胜感激。真的。太感谢了。

4

2 回答 2

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”开头的文件。进行这些更改后,我使用您的代码得到了正确的输出。

于 2012-05-14T22:19:54.623 回答
3

应该在某处记录错误。检查服务器和 PHP 日志。SOAP 客户端还有一些“跟踪/调试”设置。启用这些功能后,您可能会在上次通话/回复中获得更多信息。

没有更多信息,这里有一些观察:

  • 非标准函数名。在 ZF camelCase 是规范。
  • 非标准端口,不知道为什么但可能相关

您是否尝试过使用浏览器访问 WSDL?它解决了吗?

freenodes 的#zftalk 频道 (IRC) 也是一个很好的资源。如果您确实在那里找到答案,请在此处回复。

于 2012-05-14T22:10:05.297 回答