30

When I run the curl command

curl -v -H "Content-type: application/json" -X POST -d '{"name":"abc", "id":"12", "subject":"my subject"}' http://localhost:9292

to send a POST request with data to my Rack application, my code prints out {}. That is coming from puts req.POST() in the code below.

Why does it print out {} instead of the POST data? And how do I correctly access the POST data in my Rack application?

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
4

3 回答 3

29

通过阅读 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 中的参数解析器。为确保他们看到相同的数据并且不会出现错误,您可能需要调用req.body.rewind,可能在读取代码中的请求正文之前和之后。但是,如果您处于这种情况,您可能会考虑您的框架是否可以通过控制器上的某个选项直接处理 JSON 或请求内容类型处理程序声明等 - 很可能会有一个选项来处理这种框架内的请求。

于 2013-03-17T08:21:28.740 回答
14

尝试:

env['rack.input'].read

我在“如何使用 Rack 接收 JSON 对象”中找到了它,虽然这对我来说听起来仍然很奇怪,但它可能有效。

于 2013-03-17T08:19:57.743 回答
2

你可以试试:

req.params

希望这可以帮到你。

于 2017-07-14T07:56:45.353 回答