如何读取机架请求中的POST数据
当我运行curl命令时
curl -v -H "Content-type: application/json" -X POST -d '{"name":"abc", "id":"12", "subject":"my subject"}' http://localhost:9292
要将包含数据的POST请求发送到我的Rack应用程序,我的代码打印出{}
。 这是来自下面的代码中的puts req.POST()
。
为什么打印出{}
而不是POST数据? 如何在Rack应用程序中正确访问POST数据?
require 'json' class Greeter def call(env) req = Rack::Request.new(env) if req.post? puts req.POST() end [200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]] end end run Greeter.new
从阅读POST的文档,看起来它是基于其他内容类型为您提供解析数据。 如果你想处理“application / json”,你可能需要
JSON.parse( req.body.read )
代替。 要检查这一点,请尝试
puts req.body.read
您目前在哪里puts req.POST
。
req.body
是一个I / O对象,而不是一个字符串。 查看body
文档并查看源代码。 您可以看到这实际上与mudasobwa的答案相同。
请注意,Rack应用程序中的其他代码可能希望读取相同的I / O,例如Sinatra或Rails中的param解析器。 为了确保它们看到相同的数据而不会出现错误,您可能需要在读取代码中的请求正文之前和之后调用req.body.rewind
。 但是,如果您遇到这种情况,您可能会考虑您的框架是否具有通过控制器上的某个选项直接处理JSON或请求内容类型处理程序声明等的选项 – 很可能会有一个选项来处理这种类型的框架内的请求。
尝试:
env['rack.input'].read
我在“ 如何使用Rack接收JSON对象 ”中找到它,虽然它对我来说仍然听起来很奇怪,但它可能有效。
你可以试试:
req.params
希望这可以帮到你。
- 使用FileUtils将WWW :: Mechanize :: File保存到磁盘
- 制作Rubygem – 无法加载此类文件
- 如何使用Ruby1.9.2和roryO的net-ldap-gem从RubyOnRails3修改ActiveDirectory中的userAccountControl?
- 优雅的Rails:多个路由,相同的控制器操作
- 无法使用“关注”按钮与Acts_As_Follower一起使用
- 如何在Mac OS X上卸载Ruby on Rails?
- Rails 5同时运行puma和简单的xmlrpc服务器
- 如何在Ruby中获取方法的完全限定名称?
- Ruby / Rails – Active Record Db迁移到MySQL – 时间戳类型?