使用Ruby / Rails发布多个对象(形成错误的JSON?)

时间:2011-08-15 16:31:10

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

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

基本上我的标准客户端服务器设置正在进行中。

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

1:1d字符串数组(非常简单)@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:'内容......的意外标记,然后是字符串的其余部分。

我认为我正在发送对象,或者我是以错误的方式构建它们?

1 个答案:

答案 0 :(得分:0)

来自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,那么您必须自己将数据展平为简单的一级哈希。