0

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

基本上我有你的标准客户端服务器设置。

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

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: unexpected token at 'content .... 然后是字符串的其余部分。

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

4

1 回答 1

0

来自精美手册

表单数据必须表示为 String 到 String 的 Hash

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

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,那么您必须自己将数据扁平化为一个简单的一级 Hash。

于 2011-08-15T18:38:49.193 回答