0

私はFlexSOAPWebサービスを使用しており、WSDLに接続していますが、すべてがダンディです。しかし、私はWebサービスに不慣れで、Web担当者は休暇中なので、少し混乱しています。私が最初に行っているのは、接続チェックを実行することです。

private function configXMLHandler(event:LoaderEvent):void {
        fws.wsdl = checkWSDL;
        fws.loadWSDL();
        fws.addEventListener(LoadEvent.LOAD, wsdlLoaded);
    }

    private function wsdlLoaded(event:LoadEvent):void {
        checkAbstract = fws.getOperation("retrieveAssetIdbyLabel");
        checkAbstract.arguments = ["poll-asset-do-not-remove"];
        var token:AsyncToken = checkAbstract.send();
        token.addResponder(new Responder(checkAbstractResult, checkAbstractError));
    }

    private function checkAbstractError(event:FaultEvent):void {
        trace('Error in the WSDL');
    }

    private function checkAbstractResult(event:ResultEvent):void {

        if (event.result.returnCode == 0) {
            trace('Web service check ok');

            initContentLoader();

        } else {
            trace('Error in the WSDL');
            )

        }

    }

これは正常に機能し、期待どおりの結果が得られるので、次に進みます。次に、XMLリストを反復処理し、そのXML内のアセットごとに同じWebサービス関数を呼び出す必要があります。私の考えは、ループを使用することでした。

private function initContent(event:LoaderEvent):void {
        assetList = event.target.content.asset;

        for (var i:int = 0; i < assetList.length(); i++) {
            assetAbstract = fws.getOperation("retrieveAssetIdbyLabel");
            assetAbstract.arguments = [assetList[i + assetCount].assetLabel];  //get the current index in the xmllist + the assetCount, grab the corresponding assetLabel from the XML and pass that to the web service
            trace(assetAbstract.arguments);
            var assetToken:AsyncToken = assetAbstract.send();
            assetToken.addResponder(new Responder(getAssetResult, getAssetError));
        }
    }

    private function getAssetResult(event:ResultEvent):void {
        var treasuresAsset:TreasuresAsset = new TreasuresAsset(event.result.returnCode, assetList[assetCount].asset.assetLabel, assetList[assetCount].asset.assetImage, assetList[assetCount].asset.assetDescription);
        addChild(treasuresAsset);

        assetCount++;  //increase the asset count
    }

    private function getAssetError(event:FaultEvent):void {
        trace(event.fault);
        trace('An error occured when we tried to get an asset id in the loop');
    }

エラーが発生しました:

URLを開くときにエラーが発生しました'http://www.nhm.ac.uk/web-services/VisitorService/'SOAPFault(サーバー):org.apache.axis2.databinding.ADBException:予期しないサブ要素RetrieveAssetIdbyLabel

私がすぐに考えたのは、xml内のアセットごとにWebサービスの新しいインスタンスを作成し、最初のコードを何度も繰り返す必要があるということでした。Webサービスを1回だけ使用できますか?手順全体を再作成する必要がありますか?

ありがとう。

4

1 に答える 1

0

OK、それで私はこれを理解しました、そしてそれは単純なXML名前空間の問題でした。

交換しました:

assetAbstract.arguments = [assetList[i + assetCount].assetLabel];

と:

var sender:String = assetList[i + assetCount].assetLabel;
            assetAbstract.arguments = [sender];

そして、すべてが機能しています。

于 2012-07-24T11:20:21.123 に答える