当我运行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 http://rdoc.info/gems/rack/1.2.1/Rack/Request#body-instance_method文档并查看源代码。可以看到,这其实和mudasobwa的回答是一样的。
请注意,Rack 应用程序中的其他代码可能期望读取相同的 I/O,例如 Sinatra 或 Rails 中的参数解析器。为了确保他们看到相同的数据并且不会收到错误,您可能需要调用req.body.rewind
,可能在读取代码中的请求正文之前和之后。但是,如果您处于这种情况,您可能会考虑您的框架是否具有通过控制器上的某些选项直接处理 JSON 的选项或请求内容类型处理程序声明等 - 很可能会有一个选项来处理这种类型框架内的要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)