如何在Rails中解析传入的POST请求的json?

时间:2010-12-05 17:04:36

标签: ruby-on-rails post http-post

我有以下问题。 Web服务正在向我的应用程序发送JSON POST请求,我想解析它。

我以为我可以用

访问参数
@var = params[:name_of_the_JSON_fields]

但它不起作用。我在Heroku日志中看到,请求已完成,参数已存在,但我无法存储它们。

有没有人有想法?

5 个答案:

答案 0 :(得分:23)

当您发布JSON(或XML)时,rails将为您处理所有解析,但您需要包含正确的标头。

让您的应用包括:

Content-type: application/json

一切都会很酷。

答案 1 :(得分:11)

这个答案可能并不特定于这个确切的问题,但在设置AWS SNS推送通知时我遇到了类似的问题。我无法解析甚至查看初始订阅请求。希望这可以帮助其他有类似问题的人。

我发现如果你有一个简单的API设置,默认格式设置为json,你就不需要解析了,类似于下面的内容(在config / routes.rb中):

 namespace :api, defaults: {format: :json}  do
    namespace :v1 do
      post "/controller_name" => 'controller_name#create'
      get "/controller_name" => 'controller_name#index'
    end
  end

我发现的重要事情是传入的帖子请求可以通过变量request访问。为了将其转换为可读的JSON格式,您可以调用以下内容:

request.body.read()

答案 2 :(得分:10)

如果你在params哈希中接收JSON,你可以自己转换它:

@var = JSON.parse(params[:name_of_the_JSON_fields])

答案 3 :(得分:4)

可能为时已晚,无法帮助你,但也许未来的人会在这里查看:)也许rails应该为你解析json,但这对我来说从来没有用过。我直接读了请求体。我使用'Yajl'json解析器 - 它非常快。但是常规的旧'json'也可以在这里工作(只需使用JSON.parse)

request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe

答案 4 :(得分:1)

在大多数情况下,如果出现上述症状,则问题的真正根源是传入请求的来源:如果它向您的应用发送JSON,则它应该发送application/json的Content-Type标头。

如果您能够修改发送请求的应用,请调整该标头,Rails会将主体解析为JSON,并且一切都会按预期工作,并且已解析的JSON字段将显示在您的params哈希中

在无法实现的情况下(例如,当您不控制请求的来源时(例如,接收Amazon SNS通知的情况下)),Rails不会自动为您将主体解析为JSON,因此最好您可以自己读取并解析它,如:

json_params = JSON.parse(request.raw_post)