【问题标题】:Posting multiple objects with Ruby/Rails (Badly formed JSON?)使用 Ruby/Rails 发布多个对象(JSON 格式错误?)
【发布时间】:2011-08-15 16:31:10
【问题描述】:

这更像是一个“我在做这个正确的问题吗”。

基本上我已经完成了您的标准客户端服务器设置。

我正在尝试将多个对象作为一个对象发布到服务器。发布的对象是:

1:一维字符串数组(非常简单)@headers

2:一个散列数组,每个散列包含大约 7 个值和键。 @contentsArray

我认为类似下面的方法可以解决问题

    @postedInfo = {:info =>
      {
        :headers =>@headers,
        :content => @contentsArray
      }
    }
    myJsonReq = @postedInfo

    puts "ITS A MAAAAAAAAAAADDDDD HOUUUUUSSSSSEEEEE" #Sorry, I just saw rise of the planet of the apes
    puts myJsonReq.as_json
    res = Net::HTTP.post_form(URI.parse('http://127.0.0.1:3007/update.json'),myJsonReq)

定义的 URL 显然是服务器,但它是如何通过的,如下所示

format: json
action: update_repo
pages: "content Page Title ........."very long string with no brackets or resemblance of JSON" followed by the headers part
headers: all strings are in here
controller: Update

如果我像这样创建一个变量

@x = (params[:pages])
and puts @x.class

@x 是一个字符串,在其他代码中它会作为一个对象出现。访问无关的数组或哈希。

我自然认为我必须从 JSON 反序列化它,所以我使用了该行的

JSON.parse(@x)
JSON.parse(params)

两者都抛出 JSON::ParserError (745: 'content .... 处的意外令牌,然后是字符串的其余部分。

我认为我是在正确发送对象还是以错误的方式构造它们?

【问题讨论】:

  • 您是否尝试过使用@contentsArray.to_s?

标签: ruby-on-rails ruby json params correctness


【解决方案1】:

来自fine manual

表单数据必须表示为字符串到字符串的哈希

您正在将符号哈希传递给哈希。如果你深入研究源代码,你会发现它最终会经历这样的事情:

def set_form_data(params, sep = '&')
  self.body = params.map {|k, v| encode_kvpair(k, v) }.flatten.join(sep)
  self.content_type = 'application/x-www-form-urlencoded'
end

def encode_kvpair(k, vs)
  Array(vs).map {|v| "#{urlencode(k.to_s)}=#{urlencode(v.to_s)}" }
end

如果vs 是一个哈希(如您的情况),您将不会获得任何有用的信息。例如,将所有这些应用到 {:a => {:b => :c}} 你会得到:

"a=[:b,%20:c]"

这并不是非常有用。

因此,如果您想使用Net::HTTP.post_form,那么您必须自己将数据扁平化为一个简单的一级哈希。

【讨论】:

  • 谢谢。我不必使用 post_form 本身。我只需要发出一个帖子请求。你知道有什么方法可以处理具有良好 json 支持的 post 请求吗?
  • @OVERTONE:不是我的头,但你可以继承或猴子补丁添加你自己的set_json_form_data方法。
猜你喜欢
  • 1970-01-01
  • 2022-06-10
  • 2015-06-04
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2017-04-20
相关资源
最近更新 更多