AMF可以用作Web服务的“另一种输出格式”吗?

时间:2009-03-23 21:09:11

标签: formatting amf

我正在开发一个RESTish服务器项目,它以各种格式响应HTTP请求。这允许我们编写面向用户的应用程序并检索当时最方便的格式。例如,要查看是否有用户登录,我们可以发送:

http://serverurl/Authentication?command=whoami&format=xml

如您所能,这将返回包含有关已登录用户(如果有)的信息的XML。我们可以在json中获得相同的信息:

http://serverurl/Authentication?command=whoami&format=json

最近,我们一直在讨论添加对yaml的支持,因为它受到一些ruby和python开发人员的欢迎。与此同时,我们一直在讨论在Flex中编写原型客户端应用程序(如果您无法从我的问题中看出,那将是我们首次涉足Flex开发)。我确实理解我们可以使用我们现有的格式之一与Flex应用程序进行通信,但如果我们决定添加对这些其他格式的支持“仅仅因为我们可以”,那么使用amf特别困难或不同于输出xml或json?

5 个答案:

答案 0 :(得分:2)

AMF是Action Message Format,它只是一种以非常紧凑的二进制格式编码数据的方式。在任何严格意义上,AMF都与RPC无关。 Flex(消费者/生产者)中可用的消息传递功能使用AMF来编码所有消息的数据,这绝对不是RPC ..

回到你的问题:你用什么服务器端技术来构建你的应用程序?各种平台的AMF库都具有不同的质量和成熟度。大多数这些库应该允许您简单地传递要编码的对象,并接收可以写入与REST端点绑定的HTTP请求的输出流的字节数组。

答案 1 :(得分:2)

我目前正在使用AMF作为序列化格式的平台,与您提出的方式完全一样(在.Net平台上)。我们所做的是:

  1. 创建代表您要发送的页面的DTO。
  2. 使用WriteObject()
  3. 创建一个ByteArray并将DTO存储在其中
  4. 将内容类型更改为AMF
  5. Binary将ByteArray的Buffer写入Response流
  6. 在客户端,我们使用格式设置为二进制的常规URLLoader。 loader.data属性将是一个ByteArray并使用ReadObject,您将获得序列化的DTO。如果使用[RemoteClass]元数据和registerClassAlias,您将获得相应的类型 - 否则您将获得具有一些动态属性的通用对象。

    绕着类型化DTO绕行很酷的事情是我们可以使用常规的XML或JSON序列化器,使格式版本变得非常简单。

    我还运行测试,将ByteArrays发布回服务器以进行创建/更新,它似乎工作正常。所以从本质上讲,您现在可以将AMF用于REST。

    我也在考虑将它用于服务器到服务器的通信,因为它重量轻,并且对于序列化复杂类型似乎非常强大。

答案 2 :(得分:0)

回应Vineet Bhatia的问题: 你有没有检查过BlazeDS? http://opensource.adobe.com/wiki/display/blazeds/Overview

答案 3 :(得分:0)

呀,你可以做到,但你必须编写自己的AMF序列化器和反序列化器(只需复制Zend Framework中的一个)。或者你可以等我完成我的。我会尽量记住在这里发布。

答案 4 :(得分:-2)

AMF是一种RPC(远程过程调用)格式,与SOAP非常相似,但具有不同的目标受众。由于过程调用和对象之间存在根本区别,因此AMF 将成为您的另一种输出格式。

您应该将AMF视为“Flex Remoting”,而不是使用REST API作为针对Flex的输出格式。

进行类比:您是否认为SOAP或XMLRPC只是REST API的另一种输出格式?