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ファイルをキャッシュします)。これを行う最も簡単な方法は、「wsdl」で始まるファイルを/ tmp /フォルダー(またはシステム上の同等のもの)から削除することです。これらの変更を行った後、私はあなたのコードを使用して正しい出力を得ました。

于 2012-05-14T22:19:54.623 に答える
3

どこかにログに記録されているエラーがあるはずです。サーバーとPHPのログを確認してください。SOAPクライアント用の「トレース/デバッグ」設定もいくつかあります。これらを有効にすると、最後の呼び出し/応答に関する詳細情報が返される場合があります。

ここに詳細情報がない場合、いくつかの所見があります。

  • 非標準の関数名。ZFではキャメルケースが標準です。
  • 非標準ポート、理由はわかりませんが、関連している可能性があります

ブラウザでWSDLにアクセスしようとしましたか?解決しますか?

freenodesの#zftalkチャネル(IRC)も優れたリソースになる可能性があります。答えが見つかったら、ここに投稿してください。

于 2012-05-14T22:10:05.297 に答える