5

現在、いくつかの内部プロセスを制御する内部 SOAP サービスに取り組んでいます。これは通常、それほど難しいことではありません。ただし、非複合型に対して通常返される stdClasses を操作する代わりに、soapClient クラスマップ機能を使用してオブジェクトをマップしようとしています。

wsdlとソースがコード的に多くのスペースを占めるという事実を考慮して、この質問でそれらをスパムするのではなく、関連するドキュメントにリンクします。

まず、Soap サービスと wsdl 生成に Zend_Soap_Server と Zend_Soap_Server_Autodiscover を使用しています。

ソープ サーバー コード: https://www.dropbox.com/s/eji7l50g42m2ixl/SoapServer.txt

?wsdl リクエストの WSDL 結果: https://www.dropbox.com/s/vyxbjz7wogd8suy/wsdl.txt

SOAP サービスはサービスクラスを発行します。このクラスには、SOAP サービスからデータを取得するためのメソッドが含まれています。このメソッドは getPackages と呼ばれます。

SOAP サービスからの getPackages メソッド: https://www.dropbox.com/s/p5ddxpraju7ru6x/method_from_serviceclass.txt

getPackages メソッドは、他のデータ オブジェクトへの参照を含む DataObject を返します。これらのオブジェクトは両方のサーバーにクライアントとして存在し、両端でまったく同じです。

主なデータ オブジェクト: https://www.dropbox.com/s/qt51pw3rpq7c2ba/dataobject.txt

このサービスに接続して getPackages メソッドを呼び出すと、期待どおりの応答が得られます。vps と共有プロパティを含む stdClass です。

残念ながら、クラスマップを追加しても、結果はまったく同じままです。vps と共有プロパティを含む stdClass です。予想される結果は、vps と共有プロパティを含む Soho_Soap_DataObject_Packages オブジェクトです。

これは使用される SoapClient コードです: https://www.dropbox.com/s/ulnni84p8dawv97/SoapClient.txt

Soap を介して getPackages メソッドを呼び出すと、次のようになります。

$SoapClient = \Soho_Soap_Client::getInstance();
$packages = $SoapClient->getPackages();
print_r($packages);

出力:

stdClass Object
(
[shared] => Array
    (
        [0] => stdClass Object
            (
                [id] => 
                [title] => 
                [pricePerPeriod] => 
                [price] => 
                [minRegistrationMonths] => 
                [properties] => 
                [options] => Array
                    (
                    )
            )
    )
[vps] => 

)

ただし、応答タイプを見ると、次のようになります。

print_r( $SoapClient->__getTypes() );

出力:

    Array
    (
    [0] => Soho_Soap_DataObject_Package_Shared ArrayOfSoho_Soap_DataObject_Package_Shared[]
    [1] => struct stdClass {

    }
    [2] => Soho_Soap_DataObject_Package_Shared_Option ArrayOfSoho_Soap_DataObject_Package_Shared_Option[]
    [3] => struct Soho_Soap_DataObject_Package_Shared_Option {
        string title;
        string value;
    }
    [4] => struct Soho_Soap_DataObject_Package_Shared {
        int id;
        string title;
        int pricePerPeriod;
        int price;
        int minRegistrationMonths;
        stdClass properties;
        ArrayOfSoho_Soap_DataObject_Package_Shared_Option options;
    }
    [5] => Soho_Soap_DataObject_Package_Vps ArrayOfSoho_Soap_DataObject_Package_Vps[]
    [6] => Soho_Soap_DataObject_Package_Vps_Option ArrayOfSoho_Soap_DataObject_Package_Vps_Option[]
    [7] => struct Soho_Soap_DataObject_Package_Vps_Option {
        string title;
        string value;
    }
    [8] => struct Soho_Soap_DataObject_Package_Vps {
        int id;
        string title;
        int pricePerPeriod;
        int price;
        int minRegistrationMonths;
        stdClass properties;
        ArrayOfSoho_Soap_DataObject_Package_Vps_Option options;
    }
    [9] => struct Soho_Soap_DataObject_Packages {
        ArrayOfSoho_Soap_DataObject_Package_Shared shared;
        ArrayOfSoho_Soap_DataObject_Package_Vps vps;
    }
    )        

クラスマッピングのドキュメンテーションは最初からそれほど素晴らしいものではないため、Google はあまり役に立ちません。そのため、スタック コミュニティが私の問題に光を当ててくれることを願っています。

同じ問題を2日間見つめていると、私は絶望的になります。

少し前に、SoapClient を同じ方法で使用して、完全に機能する vmware vsphere API と通信したので、問題は WDSL に関係していると思いますが、現在は迷っています。

時間をかけて私の問題を事前に調べてくれたすべての人に感謝します。もちろん、リクエストがあれば追加情報を提供します。

4

1 に答える 1

9

コードを見ると、1つ飛び出します。それは、zend_soap_serverインスタンスが次のように独自のWSDLを使用する必要があるということです。

$SoapServer = new Zend_Soap_Server($urltowsdl, array('classmap' => $classmap));
于 2012-11-08T08:57:40.340 に答える