2014-04-15 34 views
-1

有人可以告訴我我可以如何在HTTP請求完成後檢索HTTPService對象的引用(成功和失敗)?這是一個簡單的測試應用程序,用於存儲HTTP請求。處理響應(「httpResult」和「httpFault」函數)時,似乎無法檢索哪個調用成功/失敗。Flex HTTPService:檢索發送請求的服務

這個應用程序的輸出總是「呼叫未找到」

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        initialize="init(event);"> 
<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 
     import mx.rpc.events.FaultEvent; 
     import mx.rpc.events.ResultEvent; 
     import mx.rpc.http.HTTPService; 

     private var calls:Array; 

     private function init(event:FlexEvent):void{ 
      calls = new Array(); 
      // working HTTP Call 
      test('http://v4.ipv6-test.com/api/myip.php'); 
      // not working HTTP Call 
      test('http://unknown.web.site.com/'); 
     } 
     private function test(URL:String):void{ 
      var service:HTTPService = calls[ calls.push(new HTTPService()) - 1]; 
      service.url = URL; 
      service.method = 'GET'; 
      service.addEventListener("result", httpResult); 
      service.addEventListener("fault", httpFault); 
      service.send(); 
     } 
     private function httpResult(e:ResultEvent):void{ 
      for(var i:int = calls.length; i>=0; i--){ 
       if(calls[i]==e.target || calls[i]==e.currentTarget){ 
        trace('Successful HTTP call found #' + i); 
        return; 
       } 
      } 
      trace('Successful HTTP call not found :('); 
     } 
     private function httpFault(e:FaultEvent):void{ 
      for(var i:int = calls.length; i>=0; i--){ 
       if(calls[i]==e.target || calls[i]==e.currentTarget){ 
        trace('Unsuccessful HTTP call found #' + i); 
        return; 
       } 
      } 
      trace('Unsuccessful HTTP call not found :('); 
     } 


    ]]> 
</fx:Script> 
<fx:Declarations> 
    <!-- Placer ici les éléments non visuels (services et objets de valeur, par exemple). --> 
</fx:Declarations> 
</s:WindowedApplication> 
+0

看起來像一個重複:http://stackoverflow.com/questions/3009010/httpservice-resultevent-與-FLEX-3-2抗彎曲-3-5 – Simmoniz

回答

0

我找到了,謝謝給eeerahul的答案(HTTPService/ResultEvent with Flex 3.2 versus Flex >= 3.5

看起來像開發的Flex要隱藏我們的服務人員處理結果時。無論如何,有辦法通過訪問事件對象的私有(或受保護)屬性'請求'來檢索服務的引用。通過該屬性,我們可以將結果與執行呼叫的服務相對應。

是固定我的問題行:

var curr_request:Object = AbstractOperation(e.currentTarget).request; 

新的工作代碼:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        initialize="init(event);"> 
<fx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 
     import mx.rpc.events.*; 
     import mx.rpc.events.FaultEvent; 
     import mx.rpc.events.ResultEvent; 
     import mx.rpc.http.AbstractOperation; 
     import mx.rpc.http.HTTPService; 

     private var calls:Array; 

     private function init(event:FlexEvent):void{ 
      calls = new Array(); 
      // working HTTP Call 
      test('http://v4.ipv6-test.com/api/myip.php'); 
      // not working HTTP Call 
      test('http://unknown.web.site.com/'); 
     } 
     private function test(URL:String):void{ 
      var service:HTTPService = calls[ calls.push(new HTTPService()) - 1]; 
      service.url = URL; 
      service.method = 'GET'; 
      service.addEventListener("result", httpResult); 
      service.addEventListener("fault", httpFault); 
      service.send(); 
     } 
     private function httpResult(e:ResultEvent):void{ 
      var curr_request:Object = AbstractOperation(e.currentTarget).request; 
      for(var i:int = calls.length-1; i>=0; i--){ 
       if(calls[i].request==curr_request){ 
        calls[i].removeEventListener("result", httpResult); 
        calls[i].removeEventListener("fault", httpResult); 
        trace('Successful HTTP call found #' + i); 
        return; 
       } 
      } 
      trace('Successful HTTP call not found :('); 
     } 
     private function httpFault(e:FaultEvent):void{ 
      var curr_request:Object = AbstractOperation(e.currentTarget).request; 
      for(var i:int = calls.length-1; i>=0; i--){ 
       if(calls[i].request==curr_request){ 
        calls[i].removeEventListener("result", httpResult); 
        calls[i].removeEventListener("fault", httpResult); 
        trace('Unsuccessful HTTP call found #' + i); 
        return; 
       } 
      } 
      trace('Unsuccessful HTTP call not found :('); 
     } 


    ]]> 
</fx:Script> 
<fx:Declarations> 
    <!-- Placer ici les éléments non visuels (services et objets de valeur, par exemple). --> 
</fx:Declarations> 
</s:WindowedApplication>