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

JVK*_*JVK 4 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
Run Code Online (Sandbox Code Playgroud)

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

我的目标是将发布的json作为params哈希.这样我就可以params照常使用了.

小智 16

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

将curl命令更新为如下所示:

-d '{"name":"abc","orgid":"12","subject":"my subject"}'
Run Code Online (Sandbox Code Playgroud)

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

params = JSON.parse(request.env["rack.input"].read)
Run Code Online (Sandbox Code Playgroud)

确保你 require 'json'