【问题标题】:Why is rack response body an array not a string?为什么机架响应体是数组而不是字符串?
【发布时间】:2012-05-16 13:22:11
【问题描述】:

他们文档中的经典 hello world 示例,

class HelloWorld
  def call(env)
    return [200, {}, ["Hello world!"]]
  end
end

我的问题是为什么第三个值是 [Hello world!"],而不是 "Hello world"?来自他们的文档,

Body 必须响应每一个并且只能产生 String 值。这 Body 本身不应该是 String 的实例,因为这会中断 红宝石 1.9。

为什么身体需要对每一个做出反应?在什么情况下有关系?

【问题讨论】:

  • 我会假设它可以被缓冲,然后以块的形式发送给任何请求它的人。响应可能非常大,因此服务器将其“流式传输”出来。除了对主体的整个迭代之外,您的问题是否更具体到关于 Ruby 1.9 的条款?
  • 当您考虑一下 send() 和 recv() 在 C 世界中的工作方式时,这也是有道理的。当你调用 recv 时,你给它一个地址,指向它填充的字符缓冲区。您不确定一个电话就能搞定整个身体。发送一系列字符时也是如此。

标签: ruby rack


【解决方案1】:

我认为 rack 起源于 python 的 wsgi。下面是python的解释: http://www.python.org/dev/peps/pep-3333/#buffering-and-streaming

【讨论】:

  • 正确。当你插入的组件不仅仅是发送一个预先构建的字符串数组时,Rack 会为你提供一个很好的enumerable 合约来报告你的进度以响应each。虽然对于一个 hello world 的例子来说它可能看起来很傻,但是对于更真实的东西来说它更有意义,比如一个模板引擎吐出我们生成的 HTML,例如
  • 不鼓励仅链接的答案,因为您链接的站点可能会关闭或更改。请在此处写下重点。
【解决方案2】:

从句子The Body itself should not be an instance of String, as this will break in Ruby 1.9. 来看,我假设响应的最后一个元素必须是Enumerable。由于Strings 已停止在 1.9 中包含此模块,因此您将需要某种实现它的集合。

顺便说一句:hello world 示例通常不能很好地弄清楚为什么以某种方式完成某事,它们太琐碎了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多