我正在使用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 & 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"
}
]
}
);
答案 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 & 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 文件。)