如何使用Rack接收JSON对象

问题描述 投票:5回答:3

我有一个非常简单的Ruby Rack服务器,如:

app = Proc.new do |env| 
  req = Rack::Request.new(env).params
  p req.inspect 
  [200, { 'Content-Type' => 'text/plain' }, ['Some body']]
end 

Rack::Handler::Thin.run(app, :Port => 4001, :threaded => true)

每当我使用JSON对象向服务器发送POST HTTP请求时:

{ "session": {
"accountId": String,
"callId": String,
"from": Object,
"headers": Object,
"id": String,
"initialText": String,
"parameters": Object,
"timestamp": String,
"to": Object,
"userType": String } } 

我一无所获。我可以检测到收到的请求但无法获取数据。在我的puts req.inspect控制台的结果如下:

"{}"

我该如何获取数据?

我试图通过以下方式改变它:

request  = Rack::Request.new env
object   = JSON.parse request.body
puts JSON.pretty_generate(object)

但我收到以下警告:

!! Unexpected error while processing request: can't convert StringIO into String
ruby-on-rails ruby json sinatra rack
3个回答
5
投票
env['rack.input'].gets

这对我有用。我发现使用curl或wget测试针对Rack(v1.4.1)服务器的POST请求,使用此代码作为后备来获取请求正文。野外发出的POST请求(例如GitHub WebHooks)没有同样的问题。


4
投票

似乎我应该使用类似的东西:

msg = JSON.parse env['rack.input'].read 

然后在params哈希中使用msg

至少它以这种方式对我有用。


0
投票

还有一种方法:

# ...
request  = Rack::Request.new env
object   = JSON.parse request.body.gets
# ...

请参阅文档:www.rubydoc.info/gems/rack/Rack/Lint/InputWrapper

© www.soinside.com 2019 - 2024. All rights reserved.