如何使用JSON作为请求的主体来发布来自Flash(AS2)的JSON数据

时间:2010-11-05 20:04:14

标签: flash json actionscript-2

所有

我正在开发一个需要将JSON数据发布到Web服务的Flash AS2应用程序。

在之前的项目中,我已成功使用LoadVars.send()或LoadVars.sendAndLoad()来管理:

var send_lv:LoadVars = new LoadVars();
send_lv.data = JSON.stringify({some json object});

var response_lv:LoadVars = new LoadVars();
response_lv.onData = function(rawdata) {
    var o:Object = JSON.parse(rawdata);
    ....
}

send_lv.sendAndLoad("somepage.php", response_lv, "POST");

在somepage.php中,我可以使用$ _POST ['data']获取JSON数据。

但是,在此项目中,Web服务的开发人员要求JSON内容为请求的BODY(即,不是名称/值对)。 LoadVars可以实现吗?

如果没有,是否有另一种方法可以用AS2做到这一点?

非常感谢提前!

3 个答案:

答案 0 :(得分:4)

对不起......这是本月第二次回答我自己的问题。然而,这是我到目前为止最好的......

长话短说...使用LoadVars(),您可以将一系列名称/值对POST到URL。但我发送数据的特定服务的开发人员明确要求,而不是使用名称/值对,数据是帖子的主体。

我无法弄清楚如何使用LoadVars()。

然而,看起来我可以用XML.sendAndLoad()做到这一点,即使我发送的数据实际上不是XML(在我的例子中,它是JSON)。

例如,如果JSON存储在名为json的对象中:

dataAsString = JSON.stringify(json);
var send_xml:XML = new XML(dataAsString);
var response_xml:XML = new XML()
response_xml.onData = function(rawResponseData) {
    trace (rawResponseData);
}
send_xml.sendAndLoad([url], response_xml, "POST");

如果[url]是“somepage.php”,则在PHP页面中,您可以获得如下数据:

<?php
    $data = file_get_contents("php://input");
    // data will contain now contain the json object as a string
?>

我无法想象这是唯一(或最好)的方法。例如,send_xml不是有效的XML对象(因为json字符串显然不是有效的XML)。

然而,这允许我在不使用名称/值对的情况下将JSON字符串发布到服务。

答案 1 :(得分:3)

我知道这是一个古老的话题,但我找到的最好的解决方案,也适用于PUT(通过X-HTTP-Method-Override)是从LoadVars派生出一个新类,如jadent所述: Sending JSON in ActionScript 2

class LoadJson extends LoadVars {
    public var json:String;

    public function toString() {
        return json;
    }
}

这将允许您执行以下操作:

var lj:LoadJson = new LoadJson();
lj.json = {"key":"value"};
lj.onLoad = function(success:Boolean):Void { trace(success); };
lj.addRequestHeader(["X-HTTP-Method-Override", "PUT"]);
lj.sendAndLoad("http://yoururl.com", lj, "POST");

花了3天的时间才发现-.-

答案 2 :(得分:0)

Florian Lightning的回答是正确的(感谢您发布)。

如果您想使用建议的LoadJson类替代LoadVars项目范围(它可能会处理GET个请求)toString()应该返回其超级如果没有检测到json有效载荷。

class LoadJson extends LoadVars {

    public var json:String;

    public function toString() {
        if (json != undefined) {
            return json;
        }
        return super.toString();
    }

}