ruby - 在 Sinatra post 上读取参数

标签 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

这是我的路线

namespace '/api/v1' do
  post '/verify_payload' do
    MultiJson.load(params[:payload])
  end
end

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

我是不是漏掉了什么?

我还尝试从 verify_payload 返回整个 params 但在那种情况下它也返回一个空字符串。

更新

curl -X POST -H "Content-Type: application/json" -d '{"payload":"xyz"}' http://localhost:9292/api/v1/verify_payload

不返回任何内容,服务器日志中也没有错误

[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

谢谢

最佳答案

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

表单参数看起来像这样

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

您可以使用 request.body.read 或使用 rack contrib 代替参数。

机架贡献

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

require 'rack'

require 'rack/contrib'

  1. 加载它使用 Rack::PostBodyContentTypeParser

有了这个,您可以像往常一样为 json post 数据使用 params。像这样:

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

来源:Sinatra controller params method coming in empty on JSON post request , http://jaywiggins.com/2010/03/using-rack-middleware-to-parse-json/

关于ruby - 在 Sinatra post 上读取参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20932779/

相关文章:

ruby - 用 camping 和 haml 渲染局部

ruby - 什么时候用undef_method,什么时候用remove_method?

ruby - 'eval' 应该是讨厌的吗?

Heroku 推送被拒绝

ruby - find_by_sql 等效于 mongoid?

php - JSON 异常没有返回结果

javascript - 使用 for 循环列出 json 数组中的项目,在 if 语句后停止

ruby-on-rails - 错误无法在 Windows 7x64 上构建 json gem native 扩展

api - Sinatra - API - 身份验证

ruby - Sinatra PUT 方法不起作用?