当我使用 JSON 之类的字符串传递参数时,为啥 ExternalInterface 会中断?

Posted

技术标签:

【中文标题】当我使用 JSON 之类的字符串传递参数时,为啥 ExternalInterface 会中断?【英文标题】:Why does ExternalInterface breaks when I pass parameter with JSON like string?当我使用 JSON 之类的字符串传递参数时,为什么 ExternalInterface 会中断? 【发布时间】:2011-07-06 04:24:42 【问题描述】:

我对 Flash 10 和 ExternalInterface 有一个非常奇怪的问题。我目前正在使用自制网桥将 RTMFP 与 javascript 一起使用,每当我尝试传递包含 JSON 的数据时,都会收到来自 Flash 的奇怪 Javascript 错误:

missing ) after argument list
try  __flash__toXML(Flash.Utilities.A..."")) ;  catch (e)  "<undefined/>"; 

无法获得更多信息,因为它来自 Flash,并且未绑定到任何 Javascript 文件。

要重现此问题,您可以使用此脚本:

package 

    import flash.display.Sprite;
    import flash.events.Event;
    import flash.external.ExternalInterface;

    public class Main extends Sprite 
    

        public function Main():void 
        
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        

        private function init(e:Event = null):void 
        
            removeEventListener(Event.ADDED_TO_STAGE, init);
            var test:String;

            test = "\"\\\"\"";

            ExternalInterface.call("console.log", test);
        

    


我可以做些什么来避免这个问题,这是一个已知问题吗?

【问题讨论】:

@kjy112 不,我假设 ExternalInterface.call 将负责正确转义我传递给它的数据。 @holyvier maccherone.com/larry/projects/… @kjy112 JSON 编码是在 Flash 之外完成的。我使用的只是一座桥梁。 或者在JS端序列化和反序列化:snipplr.com/view/6494/… 这不是一个合法的构造:__flash__toXML(Flash.Utilities.A..."")) ; 是否还有更多的代码被你屏蔽了......或者这就是代码实际所说的内容? 【参考方案1】:

这显然是一个已知问题,而且 Adob​​e 似乎不会很快解决它。

我发现了这个问题的 detailled explaination,基本上问题似乎是 Flash 无法正确处理 \&amp;,这可能导致在从 Flash 传输到javascript。

当你将数据从 Flash 传输到 JS 时,Flash 会尝试执行以下操作:

try 
    __flash__toXML(yourJavascriptFunction("[DATA]")) ;
 catch (e)  "<undefined/>"; 

问题在于它将您的数据置于原始状态,并且根本没有转义反斜杠。如果您的字符串仅包含 \ 并且您想在其上调用 console.log,它将尝试执行以下操作:

try 
    __flash__toXML(console.log("\")) ;
 catch (e)  "<undefined/>"; 

如您所见,这是无效的 javascript。它会在您的 Javascript 控制台中引发错误,并且永远不会调用 console.log

解决方案是对 Flash 行为进行复制或进行一些讨厌的 hack 来绕过它。

要ducktape Flash buggyness,您可以在传输之前避开黑斜线。这个解决方案现在可以工作,但是当 Flash 修复它时(很可能不会在不久的将来,如果你认为这个 bug 已知超过 4 年),它将破坏你的应用程序。

另一种可能性是对 Flash 不能很好处理的字符(\"&amp;)进行 url 编码,然后在另一端对其进行解码。

闪光:

data = data.split("%").join("%25")
           .split("\\").join("%5c")
           .split("\"").join("%22")
           .split("&").join("%26");

Javascript:

data = data.replace(/%22/g, "\"")
           .replace(/%5c/g, "\\")
           .replace(/%26/g, "&")
           .replace(/%25/g, "%");

它很丑,但它有效。

【讨论】:

“丑陋”的黑客没有奏效,但下面的逃跑却奏效了。解释仍然足够广泛,可以带来积极的影响。【参考方案2】:

诚然,这对于在 Firebug 中输出到控制台并直接起作用,但对于大多数其他应用程序(即向 Javascript 发送潜在的“无效”字符串),escapeunescape应该可以正常工作:

AS3:

var testString:String = "\"\\\"\"";
ExternalInterface.call("showString", escape(testString));

然后在 Javascript:

function showString(msg) 
    console.log(unescape(msg));
    document.getElementById('messagebox').innerhtml = unescape(msg);


<div id="messagebox"></div>

【讨论】:

以上是关于当我使用 JSON 之类的字符串传递参数时,为啥 ExternalInterface 会中断?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试将 Get API 中的 json 对象作为 C# ASP.Net 中的查询字符串参数传递时,Swagger 给出错误

当我从 Angular 传递 graphql 查询时,为啥 GraphQL 控制器中的参数查询为空?

为啥 ORDER BY 子句中的绑定参数不对结果进行排序?

无法将 Tableview 单元格值添加到 JSON 参数,为啥会为零?迅速

Dart/Flutter:当作为参数传递时,List 中的元素字符串变为空(为啥??)

Postman 400 错误请求