在Sinatra帖子上阅读参数

Sig*_*Sig 2 ruby json sinatra

我正在研究我的第一个Sinatra应用程序,我很难从一个帖子请求中获取参数.

我正在使用MiniTest :: Spec,我的规格看起来像

 payload = File.read("./spec/support/fixtures/payload.json")
 post "/api/v1/verify_payload", { payload: payload }, { "CONTENT_TYPE" => "application/json" } 
 last_response.body.must_eql payload
Run Code Online (Sandbox Code Playgroud)

这是我的路线

namespace '/api/v1' do
  post '/verify_payload' do
    MultiJson.load(params[:payload])
  end
end
Run Code Online (Sandbox Code Playgroud)

规范失败,因为last_response.body是空的.

我在这里错过了什么吗?

我也试图返回整个params,verify_payload但在这种情况下,它返回一个空字符串.

更新

curl -X POST -H "Content-Type: application/json" -d '{"payload":"xyz"}' http://localhost:9292/api/v1/verify_payload
Run Code Online (Sandbox Code Playgroud)

在服务器日志中不返回任何内容并且没有错误

[2014-01-06 01:16:25] INFO  WEBrick::HTTPServer#start: pid=10449 port=9292
127.0.0.1 - - [06/Jan/2014 01:16:27] "POST /api/v1/verify_payload HTTP/1.1" 200 6 0.0220
Run Code Online (Sandbox Code Playgroud)

谢谢

Sir*_*ame 9

Sinatra只是不解析这些数据,因为它们没有表单参数.

表单参数看起来像这样

curl -X POST 127.1:4567/-d"foo = bar"

您可以使用request.body.read或使用rack contrib 而不是params .

机架的contrib

  1. 安装它 gem install rack-contrib
  2. 需要它

    要求'机架'

    要求'rack/contrib'

  3. 加载它 use Rack::PostBodyContentTypeParser

有了它,您可以params正常使用json post数据.像这样的东西:

curl -X POST -H"Content-Type:application/json"-d'{"payload":"xyz"}'127.1:4567 /

源代码:Sinatra控制器参数方法在JSON发布请求变为,http://jaywiggins.com/2010/03/using-rack-middleware-to-parse-json/