【问题标题】:Get a JSON as POST parameter获取 JSON 作为 POST 参数
【发布时间】:2012-08-31 19:45:17
【问题描述】:

我有一个 ruby​​ 应用程序,我需要从客户端接收 JSON。接收 JSON 就像接收字符串一样?我只需要这样做:

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

仅此而已,还是在获取 JSON 时我必须做一些不同的事情?发件人必须向我发送类似字符串?

谢谢!

【问题讨论】:

  • 但是有没有其他方法可以做到这一点?或者只是通过参数获取它?
  • 你已经做对了。 POST 请求的有效负载将始终在您的参数哈希中作为字符串(或嵌套哈希,但值将始终为字符串)。实际的数据类型或数据结构是什么没有区别。就像不能将 1 作为 Integer 发送一样,也不能将 {json: true} 作为某种 JSON 对象或 Hash 发送。

标签: ruby-on-rails json post


【解决方案1】:

您所描述的内容是可以的,但这意味着有一个名为json_data 的参数。如果您的意思是整个POST 主体只不过是JSON,那么您想查看request.raw_post。你最终会得到这样的结果:

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

【讨论】:

    【解决方案2】:

    official document 说,

    如果您的请求的“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 键中,如下所示:

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

    所以,如果您将{ "hello": "world"} 发送/发布到apples/,那么 params['apple'] 将是 Json 有效负载的对象。

    class ApplesController < ApplicationController
      def create
        # params['apple'] is the object represents Json payload
      end
    end
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    相关资源
    最近更新 更多