【问题标题】:Sending binary data to (Rails) RESTful endpoint via JSON/XML?通过 JSON/XML 将二进制数据发送到(Rails)RESTful 端点?
【发布时间】:2010-09-30 09:55:47
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails json xml binary


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      希望这会有所帮助。

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          如果您的图像不是太大,将它们放入具有 RoR :binary 类型的数据库很有意义。如果您有数据库副本,则图像可以免费复制到其他站点,无需担心孤立或寡居的图像,原子事务问题变得更加简单。

          另一方面,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 来纠正这个问题。

          【讨论】:

          • 约翰!感谢您的提醒.. 特别是 xml 反序列化错误。
          猜你喜欢
          • 2012-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-14
          • 2012-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多