我有一个关于如何在服务器响应中正确使用 Rack :: Response -Object的问题。
在line 711
方法中,Rack::Lint#each
(https://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
,或者如果没有,那么在服务器响应中使用它的正确方法是什么。
非常感谢
答案 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
的别名。