apache-flex Flex HTTP服务:检索发送请求的服务

ltskdhd1  于 2022-11-01  发布在  Apache
关注(0)|答案(1)|浏览(160)

有人能告诉我如何在HTTP请求完成后检索HTTPService对象的引用(成功和失败)吗?下面是一个简单的存储HTTP请求的测试应用程序。在处理响应(“httpResult”和“httpFault”函数)时,似乎不可能检索哪个调用成功/失败。
此应用程序始终输出“未找到呼叫”

<?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>
3zwtqj6y

3zwtqj6y1#

多亏了eeerahul回答(HTTPService/ResultEvent with Flex 3.2 versus Flex >= 3.5),我才知道
看起来Flex的开发人员想在处理结果时对我们隐藏服务。无论如何,有一种方法可以通过访问事件对象的私有(或受保护)属性“request”来检索服务的引用。使用该属性,我们可以将结果与执行调用的服务相对应。
解决我的问题的行:

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>

相关问题