gpt4 book ai didi

actionscript-3 - 使用BlazeDS和AS3的URLLoader将AMF作为REST格式

转载 作者:行者123 更新时间:2023-12-04 06:37:28 25 4
gpt4 key购买 nike

我有一台带有HTTP API的ColdFusion服务器,该服务器当前返回JSON或XML格式的响应。在内部,所有这些响应都使用ColdFusion'struct'类型表示,然后转换为适当的格式,然后再呈现给请求的客户端。

使用此API的客户团队要求,除JSON和XML外,我们还返回AMF对象。现在,我已经看到(并且让我自己说了)反对在REST场景中将AMF用作“返回格式”而不是RPC格式的论点。我对它是否是一个好主意的评论不感兴趣-我只想知道它是否会起作用。如果没有,我希望有明确的理由说明为什么不会。如果可行,我希望获得有关如何“ makeitgo”的一些指导。

因此,为了实现该概念证明示例,我试图使用BlazeDS序列化两个元素的ColdFusion数组,然后在Flash Player 10 / AS3测试中使用该序列化的对象。

这是服务器端代码的样子:

//the test object I'm trying to return (keeping it simple)
var testArray = ArrayNew(1);
testArray[1]="test";
testArray[2]="monkey";

//set up output stream to requesting client
var pc = getPageContext();
var response = pc.getResponse();
var out = response.getOutputStream();

response.setHeader("Content-Type", "application/x-amf");

//not sure if AmfMessageSerializer is the appropriate class to be using here
var amfMessageSerializer = createObject("java", "flex.messaging.io.amf.AmfMessageSerializer");
var amfTrace = createObject("java", "flex.messaging.io.amf.AmfTrace"); //needed by initialize() method

amfMessageSerializer.initialize(variables.SerializationContext.getSerializationContext(), out, amfTrace);

amfMessageSerializer.writeObject(testArray);

out.close();


现在,这会生成某种二进制数据。如果我将其粘贴在.cfm中并尝试加载页面,则可以在十六进制编辑器中读取到一些内容,看起来它包含我设置的数组成员。此处需要注意:响应消息的一部分包括“ flex.messaging.io.ArrayCollection”。我还没有足够的知识来知道这将告诉我什么:任何能够提供有关在两种环境之间键入的详细信息的人都会向我表示感谢。

下一步是尝试在FlashPlayer端使用它。精简后的AS3如下所示:

myURLloader.dataFormat = URLLoaderDataFormat.BINARY;
myURLloader.addEventListener(Event.COMPLETE, completeHandler);
myURLloader.load(myURLRequest);

function completeHandler( event : Event) : void
{
var serverResponse : ByteArray = new ByteArray();
serverResponse = event.target.data;

//read the response into a generic object
var responseObject : Object = new Object();
responseObject = serverResponse.readObject(); //fails here: error #2006
}


如注释所指示,此操作失败,并显示错误#2006“提供的索引超出范围”。我已经搜索了此错误的常见原因,但没有找到明确的答案。在尝试readObject()之前,我尝试将byteArray.position重置为byteArray的开头和结尾-将其更改为结尾会吐出错误#2030“遇到文件结尾”(可能有人希望如此),但我已验证.position默认为0,这会产生#2006错误。

我很确定这里的问题在于我使用过的BlazeDS调用的选择。我想在序列化对象时可能正在序列化消息。不幸的是,针对BlazeDS的JavaDoc自动生成的文档不足以启发人。我发现所有可读性更高的资源都集中在Flash Remoting和RPC示例上。令人惊讶,我知道;但是它就是这样啊。我正在使用 Adobe BlazeDS docs;如果其他人有更好的资源,我将不胜感激。

提醒任何回答:我意识到这不是AMF的典型用法。我对建议典型的RPC方法或切换到Flash Remoting而不是HTTP / GET的响应不感兴趣。我需要的是来自HTTP请求的AMF序列化响应,可以在Flash Player客户端上反序列化。在这件事上,我别无选择。我确实需要知道这是否可行,如果可以的话,我希望获得有关如何使其工作的指导。除了“不要使用AMF!”以外,我欢迎任何其他建议。或“只需切换到Flash Remoting!”

更新:在此方面取得了一些进展:
1)在服务器端,我使用blazeDS的ASObject类创建一个简单的ASObject,并使用键值对填充它。
2)在客户端和服务器端,我必须确保将对象编码设置为AMF0。 AMF3中的相同技术会生成#2006 / Out of bounds错误,但我不确定为什么。

这是服务器端现在的代码:

//set up output stream to requesting client
var pc = getPageContext();
var response = pc.getResponse();
var out = response.getOutputStream();

response.setHeader("Content-Type", "application/x-amf");

//not sure if AmfMessageSerializer is the appropriate class to be using here
var amfMessageSerializer = createObject("java", "flex.messaging.io.amf.AmfMessageSerializer");
amfMessageSerializer.setVersion(variables.MessageIOConstants.AMF0);

var amfTrace = createObject("java", "flex.messaging.io.amf.AmfTrace"); //needed by initialize() method
amfMessageSerializer.initialize(variables.SerializationContext.getSerializationContext(), out, amfTrace);

var ASObject = createObject("java", "flex.messaging.io.amf.ASObject");
ASObject.put("testKey", "testValue"); //simple key-value map to return to caller

amfMessageSerializer.writeObject(testArray);

out.close();


这里的主要区别是,我不是在尝试序列化CF阵列,而是手动构建了一个响应对象(类型为ASObject)。

在客户端,代码现在如下所示:

myURLloader.dataFormat = URLLoaderDataFormat.BINARY;
myURLloader.addEventListener(Event.COMPLETE, completeHandler);
myURLloader.load(myURLRequest);

function completeHandler( event : Event) : void
{
var serverResponse : ByteArray = new ByteArray();
serverResponse = event.target.data;
serverResponse.objectEncoding = ObjectEncoding.AMF0; //important

//read the response into a generic object
var responseObject : Object = new Object();
responseObject = serverResponse.readObject();
trace(responseObject.testKey); //displays "testValue", as expected
}


此处的区别在于,我已将ObjectEncoding明确设置为AMF0(默认为AMF3)。

如果我在服务器和客户端上都将objectEncoding切换为AMF3,我希望一切正常,但仍然会收到2006:out of bounds错误。在AMF0和AMF3情况下,ByteArray.length属性相同,但是返回的对象的内容不同(在十六进制编辑器中查看时)。

在我提供的第一个示例中,更改objectEncoding对产生的错误没有影响。

因此,问题似乎是试图序列化ColdFusion数组:AMFSerializer不知道如何处理它。它需要显式构建为ASObject。我将构建一个清理函数来在两种类型之间进行转换。

我感觉已经取得了进展(并感谢评论和答案中的所有反馈),但是我仍然有很多未解决的问题。在我尝试使用AMF3而不是AMF0进行编码时,是否有人有任何输入可能会失败的原因?我彼此之间没有任何依恋,但我不喜欢这种“把东西扔在墙上,看看哪个粘住了”的解决问题的方法...我想知道为什么它失败了= /

最佳答案

我前一段时间做过..您可以从here查看我的博客文章,也许它可以为您提供帮助。我在服务器端而不是CF上使用Java。

关于actionscript-3 - 使用BlazeDS和AS3的URLLoader将AMF作为REST格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5721335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com