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

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

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

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

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

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

希望这有所帮助。

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

如果您使用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服务器的操作。

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

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

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

最后,让我向您介绍一下RoR的XML REST支持。 Rails :binary数据库类型将成为...当您使用默认脚手架中的代码渲染为XML时的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灯塔站点有一个补丁错误来纠正这个问题。