【问题标题】:How do I send both ASCII and binary data in one HTTP response?如何在一个 HTTP 响应中同时发送 ASCII 和二进制数据?
【发布时间】:2012-01-10 01:30:56
【问题描述】:

我目前在客户端使用 Java 1.4.2 与 Rails 3 服务器通信。当我们最初设计通信时,返回的所有信息都是 ASCII(字母数字),所以我们会使用 JSON 并将其作为地图返回。现在我们发现也需要返回二进制数据(图像),但我们不想发出两个 HTTP 请求。

在一个 HTTP 响应中发送现有 ASCII 信息和二进制数据的最佳方式是什么?我目前的想法是使用 base64 或十六进制编码,但我不知道这是否是最好的方法。在服务器 (Ruby) 端进行编码并在客户端 (Java 1.4.2) 进行解码的简单方法也是一大优势。

【问题讨论】:

  • 我会选择 Base64。它简单、广为人知且受支持。

标签: java ruby-on-rails http


【解决方案1】:

HTTP 协议允许以multipart/mixed 返回响应。这样做时,响应被划分为零个或多个部分,每个部分由边界分隔。每个部分(可以)都有自己的标题来描述部分的内容(Content-Type、Content-Length、Content-Disposition 等)。因此,您可以在响应中的一部分是 ASCII 文本,另一部分是八位字节流。

使用这种响应类型可能是您在一次 HTTP 调用中发送回混合内容的最佳选择,但需要您对 Rails 代码进行一些修改。

特别注意,如果您有基于浏览器的客户端使用相同的服务器服务,则并非所有浏览器都能正确处理 multipart/mixed 响应。

【讨论】:

  • 所以这是最高效的方式。 Base 64 在兼容性和开发要求、配置等方面听起来更好。我想由用户决定哪个更好。
  • 也不确定你指的是什么。 Base 64 是一种编码方案,不提供任何内容定义或描述协议。
  • 绝对正确,你需要在 HTTP 之上的东西。出于某种原因,人们会想到 XML。 Base 64 编码将在其中运行。不一定非常高效,但我能想到一些使用这种消息传递的成熟技术。
  • 是的,我实际上很想使用 Base64 作为向我们的代码添加现有支持的最简单方法。它在 Ruby 和 Java 中都得到了很好的支持,并且需要对我们目前拥有的内容进行最小的更改。 (我可以接受@Sergio Tulentsev 的评论作为答案吗?这是我的第一个 SO 问题。:))
【解决方案2】:

HTTP 正文是二进制的。无需对任何数据进行 ASCII 化。 Base64 在这里不相关。

如果您同时控制客户端和服务器,最简单的解决方案是拥有自己的格式。做任何你喜欢的事情来打包/解包数据。

【讨论】:

  • 是的,我认为主要问题是我们已经有了一个 JSON 编码/解码我们的数据的方法(因为它是 ASCII 开头),所以我们希望不必重新把那一点写成我们自己的格式。
猜你喜欢
  • 2010-12-13
  • 2013-12-07
  • 2011-12-13
  • 2012-01-02
  • 2022-01-15
  • 2013-11-26
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多