【发布时间】:2010-12-05 17:04:35
【问题描述】:
我有以下问题。 Web 服务正在向我的应用发送 JSON POST 请求,我想解析它。
我以为我可以访问参数
@var = params[:name_of_the_JSON_fields]
但它不起作用。我在 Heroku 日志中看到请求已完成并且参数在那里,但我无法存储它们。
有人有想法吗?
【问题讨论】:
标签: ruby-on-rails post http-post
我有以下问题。 Web 服务正在向我的应用发送 JSON POST 请求,我想解析它。
我以为我可以访问参数
@var = params[:name_of_the_JSON_fields]
但它不起作用。我在 Heroku 日志中看到请求已完成并且参数在那里,但我无法存储它们。
有人有想法吗?
【问题讨论】:
标签: ruby-on-rails post http-post
当您发布 JSON(或 XML)时,rails 将为您处理所有解析,但您需要包含正确的标头。
让您的应用包含:
Content-type: application/json
一切都会很酷。
【讨论】:
这个答案可能并不针对这个确切的问题,但我在设置 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()
【讨论】:
在症状描述的大多数情况下,问题的真正根源是传入请求的来源:如果它正在向您的应用发送 JSON,它应该发送 application/json 的 Content-Type 标头。
如果您能够修改发送请求的应用程序,调整该标头,Rails 会将主体解析为 JSON,一切都会按预期工作,解析后的 JSON 字段会出现在您的 params 哈希中。
当这不可能时(例如,当您不控制请求的来源时 - 例如接收 Amazon SNS 通知的情况),Rails 不会自动为您将正文解析为 JSON,所以最好你可以自己阅读和解析它,如:
json_params = JSON.parse(request.raw_post)
【讨论】:
如果您在 params 哈希中接收 JSON,您可以自行转换:
@var = JSON.parse(params[:name_of_the_JSON_fields])
【讨论】:
帮助你可能为时已晚,但也许未来的人会在这里检查:) 也许 rails 应该为你解析 json,但这对我来说从来没有用过。我直接阅读了请求正文。我使用'Yajl' json 解析器——它非常快。但是常规的旧 'json' 也可以在这里工作(只需使用 JSON.parse)
request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe
【讨论】:
Content-Type 确实会使rails 自行解析它。不知道为什么你会看到你所看到的。