Adobe Air,并通过JSONP获取数据

时间:2013-08-19 22:43:05

标签: jquery ajax air adobe

我正在使用javascript / jQuery和Adobe Air,出于某种原因,我无法让它工作,以便我可以从服务器提取数据。

这在浏览器中工作正常(单个项目正确附加到ul,弹出窗口显示“SUCCESS”),但是当我在Adobe Air中运行它时,它似乎没有工作(获得弹出窗口说“ ERROR“,并没有写入ul。”

这是我的JS代码:

jQuery("#whatever").append("<ul><li>test</li></ul>");
var url = 'http://www.mysite.com/test.php?callback=?';
var data = '';

jQuery.ajax({
   type: 'GET',
    url: url,
    async: false,
    jsonpCallback: 'jsonCallback',
    contentType: "application/json",
    dataType: 'jsonp',
    success: function(data) {
        alert("SUCCESS");
       jQuery.each(data, function() {
          jQuery.each(this, function(k, v) {
            jQuery("<li></li>").html(v.siteName).appendTo("#whatever ul");
          });
        });
    },
    error: function(e) {
        alert("ERROR");
       console.log(e.message);
    }
});

服务器上的JSON代码:

jsonCallback(
{
    "sites":
    [
        {
            "siteName": "JQUERY4U",
            "domainName": "http://www.jquery4u.com",
            "description": "#1 jQuery Blog for your Daily News, Plugins, Tuts/Tips &amp; Code Snippets."
        },
        {
            "siteName": "BLOGOOLA",
            "domainName": "http://www.blogoola.com",
            "description": "Expose your blog to millions and increase your audience."
        },
        {
            "siteName": "PHPSCRIPTS4U",
            "domainName": "http://www.phpscripts4u.com",
            "description": "The Blog of Enthusiastic PHP Scripters"
        }
    ]
}
);

1 个答案:

答案 0 :(得分:0)

以下是如何从基于Adobe AIR的应用程序中的服务器获取数据。

<?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"
                       applicationComplete="init()" 
                       width="620" height="740" 
                       frameRate="30">
<fx:Script>
    <![CDATA[

        import com.adobe.serialization.json.JSON;

        // var ini
        // ------------------------------------------------------------------------
        private var filePath:String = "http://www.mysite.com/test.php?callback=?";// URL or path to JSON Source // can be "assest/jsondata.txt";
        private var urlLoader:URLLoader;
        private var jsonDataArray:Array;
        private var jsonObj:Object;
        private var request:URLRequest;
        private var variables:URLVariables;
        private var requestFilters:String;
        private var requestHeaders:Array;//used for content-type headers and such
        private var arr:Array = new Array();// saving all objects to dataGrid
        // ------------------------------------------------------------------------


        // ------------------------------------------------------------------------
        private function init():void
        {
            requestHeaders = new Array(new URLRequestHeader("content-type","application/json"));//add as many comma separated headers as you need to send to server
            // Add event listener for button click
            btn.addEventListener(MouseEvent.CLICK,loadJSONData);
        }
        // ------------------------------------------------------------------------




        // ------------------------------------------------------------------------
        private function loadJSONData(e:MouseEvent=null):void
        {
            // Load file
            urlLoader = new URLLoader();
            urlLoader.addEventListener(Event.COMPLETE, fileLoaded,false,0,true);
            urlLoader.addEventListener(IOErrorEvent.IO_ERROR, fileLoadFailed);
            request = new URLRequest();
            request.method = URLRequestMethod.POST;//use URLRequestMethod.GET if you want
            request.requestHeaders = requestHeaders;//headers to send
            request.data = 'jsonCallback';//can send data/parameters with this request to server. If server requires data/parameters sent as JSON string, you can accomplish it passing JSON String like this: request.data = '{"jsonrpc": "2.0", "method": "SportsAPING/v1.0/listEventTypes", "params": { "filter" : {} }, "id": 1}';
            request.url = filePath;
            urlLoader.load(request);
        }
        // ------------------------------------------------------------------------


        private function fileLoadFailed(e:Event):void
        {
            trace("Failed: "+e.target.data.toString());
        }



        // ------------------------------------------------------------------------
        private function fileLoaded(e:Event):void
        {
            // Clean up file load event listeners
            urlLoader.removeEventListener(Event.COMPLETE, fileLoaded);

            // If you wanted to get the data from the event use the line below
            //var urlLoader:URLLoader = URLLoader(event.target);

            trace("urlLoader.data: "+urlLoader.data+", Data type: "+typeof(urlLoader.data));

            var Obj:Object = urlLoader.data;

            // Parse the response to get Array or Object depending on how the JSON is formatted on Server.
            //jsonDataArray = com.adobe.serialization.json.JSON.decode(urlLoader.data);

            // converts urlLoader.data to a localized Object or Array

            // check if the returned data is an Object
            if(typeof(com.adobe.serialization.json.JSON.decode(urlLoader.data))=='object')
            jsonObj = com.adobe.serialization.json.JSON.decode(urlLoader.data);
            // if data returned is an Array
            else if(typeof(com.adobe.serialization.json.JSON.decode(urlLoader.data))=='object' && com.adobe.serialization.json.JSON.decode(urlLoader.data).length>2)
            jsonDataArray = com.adobe.serialization.json.JSON.decode(urlLoader.data);
            /* Your Data Format
            {
                    "sites":
                    [
                        {
                            "siteName": "JQUERY4U",
                            "domainName": "http://www.jquery4u.com",
                            "description": "#1 jQuery Blog for your Daily News, Plugins, Tuts/Tips &amp; Code Snippets."
                        },
                        {
                            "siteName": "BLOGOOLA",
                            "domainName": "http://www.blogoola.com",
                            "description": "Expose your blog to millions and increase your audience."
                        },
                        {
                            "siteName": "PHPSCRIPTS4U",
                            "domainName": "http://www.phpscripts4u.com",
                            "description": "The Blog of Enthusiastic PHP Scripters"
                        }
                    ]
                }
            */



            // now you should be able to access the data like this:
            trace(jsonObj.sites[0].domainName);
            // or
            trace(jsonDataArray[0].siteName);
            // Now you can loop through your received data as usual.
        }
        // ------------------------------------------------------------------------




    ]]>
</fx:Script>

<mx:DataGrid id="dg" top="100" width="600" height="600" horizontalCenter="0">
    <mx:columns>
        <mx:DataGridColumn width="200" dataField="name" headerText="Name"/>
        <mx:DataGridColumn dataField="value" headerText="Value"/>
    </mx:columns>
</mx:DataGrid>
<mx:Label top="15" color="#0D595A" fontSize="30" fontWeight="bold" horizontalCenter="4"
          text="Get JSON Data From Server"/>
<mx:Button id="btn" top="70" width="200" label="Get JSON Data from Server"
           chromeColor="#A7FEFF" fontWeight="bold" horizontalCenter="0"/>
</s:WindowedApplication>

现在,这是一个完整的代码,可以帮助您开始使用从服务器加载JSON数据的Adobe AIR App。

我在这个例子中使用import com.adobe.serialization.json.JSON;。并且需要包含它以将以String格式接收的JSON数据解析/解码为Local ActionScript Object。

您可以从GITHUB下载as3corelib

如果您使用Adobe Flash创建AIR App ,则必须在库/源路径中包含此库。

如果您正在使用Adobe Flash Builder 4.6 Premium ,那么:

1)在Adobe Flash Builder中,确保您使用的是Flash Builder透视图,从Package Explorer中,右键单击您的项目并选择属性。 (这将打开您的项目属性)

2)在项目的属性对话框中,选择“Flex Build Path”。

3)在“Flex构建路径”对话框中,选择选项卡:“库路径”。

4)点击右侧的“添加SWC”按钮。并浏览到以下位置:“ as3corelib.swc ”文件。 (如果将此文件放在Applications主目录中的“ libs ”文件夹/目录中,则会更好,其中“ bin-debug < / em>“目录也驻留。”现在选择文件并单击“确定”按钮。

5)再次单击“确定”按钮以关闭“项目”的“属性”对话框。

6)现在保存所有项目文件和所有内容,然后关闭Flash Builder。

7)现在重启Flash Builder。运行或调试您的项目。您应该能够在控制台日志中看到trace语句的输出。

8)如果在编译项目时出现错误,那么您还必须在项目的“ src 中包含com.adobe.serialization.json.JSON;“目录,通过解压缩包含 as3corelib 的源ActionScript类的Zip文件。

9)现在应该可以了。更好地重新启动Flash Builder。现在,您项目的 SRC 目录应该有一个 com 目录,其中包含的其他目录和ActionScript类as3corelib 包。 (至少我现在没有问题,我添加了 as3corelib.swc 和包的源文件)

github 上下载“ as3corelib ”。它包含 lib 目录中的 as3corelib.swc 文件以及 com.adobe.serialization.json个包的ActionScript 3.0源类src 目录。 (您可能需要将所有内容的 com 目录复制到项目的根目录中的 libs 目录中目录。这样您就可以在代码中调用 decode encode 方法,并将其编译到 SWF 和< strong> AIR 文件。)