5

我有这个卷曲电话:

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像往常一样使用了。

4

2 回答 2

18

您实际上传递的是 Ruby 哈希而不是 JSON 对象。

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

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

然后在您的 Sinatra 操作中执行以下操作:

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

确保你require 'json'

于 2012-12-03T00:27:24.937 回答
0

利用

require 'json'
params = JSON.parse(request.body.read)
于 2017-11-24T09:06:25.013 回答