通过JSON / XML将二进制数据发送到(Rails)RESTful端点?

时间:2009-01-09 01:04:01

标签: ruby-on-rails json xml binary

我目前正在组建一个基于rails的Web应用程序,该应用程序仅通过json和xml提供和接收数据。但是,某些要求包含上传二进制数据(图像)的功能。

现在我的理解JSON并不完全是为了那个......但是你如何解决在你的应用程序的这两个入口点上接收二进制文件/数据的问题?

4 个答案:

答案 0 :(得分:9)

我建议将二进制数据编码为base64。这样可以安全地使用XML或JSON格式。

http://en.wikipedia.org/wiki/Base64

答案 1 :(得分:5)

也许您可以查看Base64算法。 这用于将所有内容“转换”为ascii char。 您可以对其进行编码和解码。它用于web服务,甚至用于dotnet序列化。

希望这有点帮助。

编辑:我看到“新帖子”,在发帖时,有人速度更快。Rails base64

答案 2 :(得分:4)

如果您使用的是Rails,json和xml,而不是使用HTTP。 “POST”是HTTP的一部分,是转换二进制数据的最佳方式。 Base64是一种非常低效的方法。

如果您的服务器正在发送数据,我建议在XML或JSON中为服务器上的文件添加路径。这样,您的服务器就不必对数据进行base64编码,而已经支持HTTP GET的客户端可以在不解码数据的情况下下拉数据。 (GET / path / to / file)

要发送文件,请让您的服务器和/或客户端生成唯一的文件名并使用两步过程;客户端将使用fileToBeUploaded:“file.ext的名称”发送xml或json消息,并在发送消息后将使用上述文件名POST数据。同样,客户端和服务器不必对数据进行编码和解码。这可以通过使用多部分请求的一个请求来完成。

Base64很简单,但会根据数据大小和请求频率快速咀嚼CPU和/或内存。在服务器端,它也不是缓存的操作,而从磁盘读取文件的Web服务器的操作是。

答案 3 :(得分:2)

如果您的图像不是太大,将它们放在具有RoR:二进制类型的数据库中会非常有意义。如果你有数据库副本,那么图像会被免费复制到其他网站,不用担心孤立或丧偶的图像,并且原子事务问题会变得更加简单。

另一方面,Nessence是正确的,Base64与任何编码层一样,确实为事务添加了网络,内存和CPU负载。如果网络带宽是您的首要问题,请确保您的Web服务接受并提供deflate / gzip压缩连接。这将降低网络层上Base64数据的成本,尽管代价是更多内存和CPU负载。

这些是应与您的团队和/或客户讨论的架构问题。

最后,让我先介绍一下RoR的XML REST支持。当您使用默认脚手架中的代码渲染到XML时,Rails :binary数据库类型将成为<object type="binary" encoding="base64">...</object> XML对象:

def show
  @myobject = MyObject.find(:id)
  respond_to do |format|
    format.xml { render => @myobject }
  end
end

这适用于GET操作,PUT和POST操作也很容易编写。问题是Rails PUT和POST操作不接受相同的标签。这是因为from_xml代码不解释type="binary"代码,而是查找type="binaryBase64"。在Rails灯塔站点有一个bug补丁来纠正这个问题。