如何使用Rack接收JSON对象

我有一个非常简单的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 

 env['rack.input'].gets 

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

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

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

然后在msg哈希中使用params

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

还有一种方法:

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

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