1

以前の開発者からアプリケーションを引き継ぎましたが、Nusoap を使用して半分完成したコードがいくつかありました。次のエラーが表示されます。

Call to register_donation() web service failed due to an exception: 
Function ("register_donation") is not a valid method for this service   

アプリケーションは以下に基づいて構築されています: CakePHP 1.2.10& using nuSoap 0.9.5.

私はすでに持っていますini_set('soap.wsdl_cache_enabled', 0);(これは役に立ちません。)

私のコードは以下のとおりです (読みやすくするために短くしています)。この応答を正しく処理していますか? (コードは前の開発者から私が引き継いだものです)。

Pastebin (完全なコード) はこちら: PasteBin Link

以下に短縮版を示します。完全版は上のペーストビン リンクにあります。

<?php
ini_set('soap.wsdl_cache_enabled', 0);

class ServicesController extends AppController
{
var $uses = array("Donation");
var $components = array( "Email", "MatchingEvents" );

function registerDonation($donation = null){
    $this->log('hit registerDonation', 'donation');
    $this->autoRender = false;
    App::import('Vendor','nusoap');
    Configure::write('debug',0);
    Configure::write('Session.start', false);

    //init soap server
    $server = new soap_server();

    $endpoint = 'http://new.mysite.com/services/registerDonation';

    //initialize WSDL support
    $server->configureWSDL('donations', 'urn:donations', $endpoint);

    //setup service type
    $server->wsdl->addComplexType(
        'DonationResult',
        'complexType',
        'struct',
        'all',
        '',
        array(
            'success' => array('name' => 'success', 'type' => 'xsd:boolean'),
            'msg' => array('name' => 'msg', 'type' => 'xsd:string'),
            'error_number' => array('name' => 'error_number', 'type' => 'xsd:string')
        )
    );

    //register the method to expose
    $server->register('register_donation',
        array('ct_number' => 'xsd:string', 'project_id' => 'xsd:int', 'donation_amount' => 'xsd:decimal',
            // Stripped all other params
        ),
        array(
            'result' => 'tns:DonationResult'
        ),
        'urn:donations',
        'urn:donations#register_donation',
        'rpc',
        'encoded',
        'Accepts the results of a donation to a charity or project on the  site'
    );

    //This inner function is registered and then called (keep within outer function!)
    function register_donation(
        // Pass in all the params (Stripped for readability)
        $ct_number = null, $project_id = null, $donation_amount = null
    ){
        // This function is never hit!.. its not registered, why?
        $this->log('hit #3-register_donation called!', 'donation');
        $return = $this->Donation->add(array(
            'unique_id' => $unique_id,
            'ct_number' => $ct_number,
            'project_id' => $project_id,
            'donation_amount' => $donation_amount,
            // Pass in all other params, (Stripped for readability)
        ));

        // Process that request
        $log = $this->Donation->log . 'Result: ' . $return['msg'] . "\n";
        $this->log( $log, 'donation' );
        if ( isset($this->Donation->matching['events']) )
        {
            //Reserved donations should already have had their events handled
            $this->MatchingEvents->handle($this->Donation->matching, !$this->Donation->matching['reserved']);
        }
        if ( !empty($this->Donation->cacheSaved) )
            $this->_sendDonationEmails($this->Donation->cacheSaved);
        return $return;
    }

    $HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
    $server->service($HTTP_RAW_POST_DATA);
}

function _sendDonationEmails($donation)
{
    // Send the emails
}
}

?>

提供できる情報が他にもありましたら、お知らせください。

要約:外部ソースからの nusoap 応答を処理するにはどうすればよいですか。
デバッグのアイデア、ヒントとヒント、または解決策は報われます (+1!)。

4

1 に答える 1

4

投稿されたコードには、という名前registerDonationのコントローラー内にという名前の関数がありServicesControllerます。その関数内には、別の関数が呼び出されていますregister_donation(これは明らかに意味をなさない [古いコード])。

register_donationメソッドから outという名前の関数を削除し、registerDonation内のメソッドとして配置しServicesContollerます。

次に、次の行 (公開する関数を登録する場所) を変更します。

出発地:$server->register('register_donation',
到着地:     $server->register('ServicesController.register_donation',

したがって、メソッドのみではなく呼び出しています(これは PHP4 手続き型プログラミングでは機能しますが、OOP では、関数を公開するときにclass.methodを指定する必要があります)。controller.method


他に問題がありますか?

Q: CakePHP と nuSOAP がコントローラー/メソッドに当たらず、app/webroot にリダイレクトされます A: CakePHP 1.2 を使用していて、(技術的に必要ではないため) サービス モデルがないことがわかりました。コントローラー。したがって、この問題が発生している場合は、コントローラーを使用していなくても、コントローラーのモデルを作成してください。参考までに、ここにモーダルの例を示します。

<?php // You may not need this modal, but cakephp requires it to be there.
class Services extends AppModel {
   public $name = 'Services';
   public $useTable = false;
}
?>

Q: 応答を受け取る URL を教えてください。 A:応答をヒットするように設定する URL には、?wsdl.
たとえば、 という名前のコントローラーと という名前SOAPControllerのメソッドがありprocessます。
CakePHP では、URL は次のようになりますmydomain.com/SOAP/process
あなたのWSDL場所はmydomain.com/SOAP/process?wsdlです。コールバック URL がこれに設定されていることを確認してください (を含むwsdl)。

Q: CakePHP を使用して SOAP リクエスト/レスポンスをデバッグするにはどうすればよいですか?
A: CakePHP にはロギング機能があり、デバッグに非常に役立つことが証明されていSOAPます。コントローラー(またはモーダル)では、次を使用できます。

$this->log('your message or variable', 'name_of_file_to_save_to);

リクエストまたはレスポンスでこれを使用して、SOAPヒット/コールされている部分とデバッグ変数 (例: $HTTP_RAW_POST_DATA) を確認できます。

Q: SOAP ページにアクセスすると、WSDL の場所が「domain.com/app/webroot」と表示されます。

A:私はこれがすべての問題を引き起こしている問題だと思っていました. ソースコードを見ると現在のスクリプトを取得するためにNusoap使わPHP_SELFれています (cakePHP では です) ,これapp/webroot/index.phpについては心配しないでください.生成されたファイルを表示します。これを修正することを心配する必要はありません。あなたのリクエストを邪魔するものではありません。単にあなたの便宜のためにそこにあるだけです。wsdl?wsdlWSDLSOAP

Q: SOAP アドレスの場所に「domain.com/app/webroot/index.php」と表示されています

A:$endpointこれは、 に を含めることで修正した問題configureWSDL()です。

//Set our endpoint, Replace with your URL
$endpoint = 'http://yourdomain.com/controller/method';

//initialize WSDL support - Include the $endpoint.
$server->configureWSDL('donations', 'urn:donations', $endpoint);

// Now your Soap Address Location should be what you set as the $endpoint
于 2012-10-30T19:30:34.043 に答える