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

tho*_*877 20 post ruby-on-rails http-post

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

我以为我可以用它来访问参数

@var = params[:name_of_the_JSON_fields]
Run Code Online (Sandbox Code Playgroud)

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

有没有人有想法?

Jes*_*ott 26

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

您的应用包括:

Content-type: application/json
Run Code Online (Sandbox Code Playgroud)

一切都会很酷.


Mat*_*e3o 12

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

我发现你并不需要解析,如果你有设置为JSON,类似下面(在配置/ routes.rb中),默认的格式简单的API设置:

 namespace :api, defaults: {format: :json}  do
    namespace :v1 do
      post "/controller_name" => 'controller_name#create'
      get "/controller_name" => 'controller_name#index'
    end
  end
Run Code Online (Sandbox Code Playgroud)

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

request.body.read()
Run Code Online (Sandbox Code Playgroud)


mlt*_*tsy 11

在具有描述的症状的大多数情况下,问题的真正根源是传入请求的来源:如果它向您的应用程序发送 JSON,则它应该发送application/json.

如果您能够修改发送请求的应用程序,请调整该标头,Rails 会将正文解析为 JSON,一切都会按预期工作,解析的 JSON 字段出现在您的params哈希中。

如果这是不可能的(例如,当您无法控制请求的来源时 - 例如在接收 Amazon SNS 通知的情况下),Rails 不会自动将正文解析为 JSON,因此您可以尽可能地自己阅读并解析它,如下所示:

json_params = JSON.parse(request.raw_post)
Run Code Online (Sandbox Code Playgroud)


zet*_*tic 10

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

@var = JSON.parse(params[:name_of_the_JSON_fields])
Run Code Online (Sandbox Code Playgroud)


Kev*_*vin 5

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

request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe
Run Code Online (Sandbox Code Playgroud)