【问题标题】:Webservice that returns an image plus a number返回图像和数字的 Web 服务
【发布时间】:2011-01-10 19:00:33
【问题描述】:

如果我有一个返回图像的 web 服务,是否有标准方法让它返回一些结构化数据(在最简单的情况下,一个额外的字符串或数字)?

请参阅this question 以获取返回图像的 Web 服务的 PHP 示例。 (但我现在的问题并不特定于 PHP。)

可能的解决方案(大多不是很令人满意):

  1. 将额外的数据放入图像的元数据中。
  2. 将额外数据放入 HTTP 标头中。
  3. 让 web 服务返回一个 nonce URL,可以在有限的时间内从中获取图像。
  4. Base64 编码图像并使其成为 JSON 或 XML 数据结构中的巨大字符串字段。 (感谢CarlesTiago。)

你会怎么做?

(我真的不想将 web 服务分成两个单独的调用,因为 web 服务需要大量参数,并且将它们全部发送两次似乎很浪费。)

【问题讨论】:

    标签: web-services


    【解决方案1】:

    HTTP 标头是一个可行的选择,因为它们可以很容易地在服务器端和客户端进行解析。您可以做的另一件事是设置一个 302,将其重定向到 URL 中包含图像和数据的 URL(例如 ->

    1. 点击http://mysite.com/bestimageever.png
    2. 获取 302 到 http://mysite.com/realbestimage.png?supercoolinfo=42

    这对用户来说是透明的,大多数 API 客户端都可以工作(因为它们处理重定向)

    【讨论】:

    • 谢谢大卫!使用 HTTP 标头似乎有点……不标准,但也许我会这样做。我不确定我是否喜欢 302 重定向的想法,因为原始 URL 需要自己的参数来生成图像,所以它最终看起来相当混乱。
    • +1 我喜欢这种方法!反正意味着2个请求,base64编码的开销太大就好了
    【解决方案2】:

    返回图片的base64编码的二进制数据,以及附加字段:

    { image: "mIIerhdkwje...", data: "data" }
    

    Base64 编码为您提供 33% 的开销(每 3 个原始字节需要 4 个字节)。根据数据的大小,最好将其替换为二进制数据的 url 并发出第二个请求...

    【讨论】:

    • 酷,谢谢。我想这也是蒂亚戈在他的回答中的意思。所以你很确定这是最好的方法吗?
    • 这是我会使用的,因为缺乏更好的了解;)
    【解决方案3】:

    协议缓冲区是另一种选择。协议缓冲区不像 XML 或 JSON 那样是自描述的,但它们在网络上更加紧凑。 Google 库 (http://code.google.com/p/protobuf) 提供了 C++、Java 和 Python 库,贡献者还提供了许多其他语言的库 (http://code.google.com/p /protobuf/wiki/ThirdPartyAddOns),包括 Javascript 和 PHP,因此客户端编写者应该可以轻松地使用该格式。

    【讨论】:

      【解决方案4】:

      难道不能在返回的 json/xml 中包含二进制数据来形成图像吗?通过这种方式,您可以根据需要添加尽可能多的字段,并且可以在客户端中处理这些信息。

      【讨论】:

      • 你确定可以吗?例如,JSON 不是只有文本吗?我想我可以将图像编码为一个巨大的字符串,然后它可能是 JSON 对象中的字段之一。是这个意思吗?
      • 是的。您只需要检查您的服务器对 Web 服务器生成的输出大小的限制。我知道您的应用程序将处理 Web 服务器的输出以将其转换为图像。
      猜你喜欢
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多