在服务器 - 答案中正确使用Rack :: Response-Object

时间:2018-04-21 06:30:40

标签: ruby rack

我有一个关于如何在服务器响应中正确使用 Rack :: Response -Object的问题。

line 711方法中,Rack::Lint#eachhttps://github.com/rack/rack/blob/master/lib/rack/lint.rb#L711)在part.kind_of? String之内断言assert("Body yielded non-string value #{part.inspect}")

最基本的回应是像

这样的三元组
  

[状态,标题,正文]

当我将Rack::Response - 对象放在三元组中时,我收到了一条错误消息:

  

[status,headers,rs]

其中rs是Response-Object。

我让它与

一起工作
  

[status,headers,st.body]

然而,因为它然后通过上述断言!

我的问题是,只有这样才能正确使用Rack::Response,或者如果没有,那么在服务器响应中使用它的正确方法是什么。

非常感谢

1 个答案:

答案 0 :(得分:1)

Rack::Response只是一个新的界面,包含3个参数,正文,状态代码和标题。

body参数可以回复#to_str,也可以实现#each,而#each产生的任何内容都必须回复#to_s

因此,直截了当的回答认为这是有效的:

response = Rack::Response.new(
  ['a','series', 'of', 'strings'],
  200,
  { 'Content-Type' => 'application/json' }
)

这也是有效的

response = Rack::Response.new(
  '{}',
  200,
  { 'Content-Type' => 'application/json' }
)

或者,如果您有一个自定义类,它代表来自API的响应,那么这也足够了:

class ApiClient
  def initialize
    @response = get_something
  end

  def each
    @response.chars.each { |el| yield el }
  end

  private

  def get_something
    "a string of responses"
  end
end

response = Rack::Response.new(
  ApiClient.new,
  200,
  { 'Content-Type' => 'application/json' }
)

当您准备好将响应对象返回给调用者时,只需在#finish实例上调用Rack::Response即可。这也是#to_a#to_ary的别名。