将JSON作为POST参数获取

7

我有一个 Ruby 应用程序,需要从客户端接收 JSON 数据。接收 JSON 数据就像接收字符串一样吗?我只需要做类似这样的事情:

information = params[:json_data]
data_parsed = JSON.parse(information)

我需要做些不同的事情来获取JSON吗?发送方必须将其发送给我,就像字符串一样吗?

谢谢!


但是还有其他的方法吗?或者只能通过参数获取它? - Andres
你已经做得很好了。POST请求的有效载荷将始终作为字符串(或嵌套哈希,但值始终为字符串)包含在参数哈希中。实际数据类型或数据结构是什么并不重要。就像您无法将1作为整数发送一样,您也无法将{json:true}作为某种JSON对象或哈希发送。 - doesterr
2个回答

27

您描述的很好,但这意味着有一个名为json_data的参数。如果您的意思是整个POST请求体都是 JSON,那么您需要查看 request.raw_post。您最终将得到类似于以下内容:

information = request.raw_post
data_parsed = JSON.parse(information)

16

官方文档中提到:

如果您的请求的"Content-Type"标头设置为"application/json",Rails将自动将您的参数加载到params哈希表中,您可以像通常一样访问它们。

例如,如果您发送此JSON内容:

{ "company": { "name": "acme", "address": "123 Carrot Street" } }

你的控制器将会接收到 params[:company],其值为 { "name" => "acme", "address" => "123 Carrot Street" }

如果在你的初始化程序中打开了 config.wrap_parameters 或者在你的控制器中使用了 wrap_parameters,那么你可以安全地省略JSON参数中的根元素。此时,参数将被复制并包装成一个键,该键基于你的控制器名称进行选择。因此,上述JSON POST请求可以写成:

{ "name": "acme", "address": "123 Carrot Street" }

假设您正在将数据发送到CompaniesController,那么它将被包装在:company键中,如下所示:

并且,假设你正在将数据发送给CompaniesController,那么它会像这样被包裹在:company关键字中:

{ name: "acme", address: "123 Carrot Street", company: { name: "acme", address: "123 Carrot Street" } }
因此,如果您将{"hello":"world"}发送/ POST到apples / ,那么params ['apple']将是Json负载对象。
class ApplesController < ApplicationController
  def create
    # params['apple'] is the object represents Json payload
  end
end

请注意,deep_munge 有时会干扰参数,请参见 https://github.com/rails/rails/issues/13766。 - Shelvacu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接