Публикация нескольких объектов с помощью Ruby / Rails (плохо сформированный JSON?) - PullRequest
0 голосов
/ 15 августа 2011

Это больше "я делаю этот правильный вопрос".

В основном у меня настроена стандартная настройка клиентского сервера.

Я пытаюсь опубликовать несколько объектов как один на сервере. Размещаемые объекты:

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: неожиданный токен в 'content .... и затем остальная часть строки.

Я думаю, что отправляю объекты правильно или я их неправильно строю?

1 Ответ

0 голосов
/ 15 августа 2011

Из тонкой инструкции :

Данные формы должны быть представлены как Hash of String to String

Вы передаете Хэш Символа Хэшу. Если вы покопаетесь в источнике, вы увидите, что он проходит через это:

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 самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...