如何读取机架请求中的POST数据

时间:2013-03-17 06:56:00

标签: ruby rack

当我运行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

3 个答案:

答案 0 :(得分:21)

通过阅读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或请求内容类型处理程序声明等的选项 - 很可能会有一个选项来处理这种类型的在框架内提出请求。

答案 1 :(得分:10)

尝试:

env['rack.input'].read

我在“How to receive a JSON object with Rack”中找到了它,虽然对我来说听起来仍然很奇怪,但它可能会有效。

答案 2 :(得分:4)

您可以尝试:

req.params

希望这可以帮到你。