如何从sinatra应用程序中发布的JSON捕获params哈希

时间:2012-12-03 00:21:21

标签: ruby sinatra

我有这个卷曲电话:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"name":"abc", "orgid":"12", "subject":"my subject"}' http://localhost:3000/mysinatraapp

post '/mysinatraapp' do
unless request.preferred_type.eql? 'text/html'
  # This is not really params hash. It will be a string like "{\"name\"=>\"abc\", \"orgid\"=>\"12\", \"subject\"=>\"my subject\"}"
    params = request.env["rack.input"].read 
    ...
    ...
    halt 400 if params.length == 0
end
  # This does not work
p "hi #{params['name']}"
end

p "hi #{params['name']}"失败,因为它不是哈希值。我如何使它工作?

我的目标是将发布的json设为params哈希。所以我可以像往常一样使用params

2 个答案:

答案 0 :(得分:16)

您实际上是在传递Ruby Hash而不是JSON对象。

将curl命令更新为:

-d '{"name":"abc","orgid":"12","subject":"my subject"}'

然后在你的Sinatra行动中这样做:

params = JSON.parse(request.env["rack.input"].read)

确保require 'json'

答案 1 :(得分:0)

使用

require 'json'
params = JSON.parse(request.body.read)