При работе с URIs, это хорошая идея, чтобы использовать инструменты, предназначенные для них, такие как URI, который поставляется с Ruby.
URI, не может быть
http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das
потому что data
компонент недействителен. Если вы добавляете data
, то я хотел бы начать с:
require 'uri'
uri = URI.parse('http://172.0.0.1:22230/test.action?sign=x6das')
query = URI.decode_www_form(uri.query).to_h # => {"sign"=>"x6das"}
data = {"foo" => "bar","joe" => "doe"}
uri.query = URI.encode_www_form(query.merge(data)) # => "sign=x6das&foo=bar&joe=doe"
uri.to_s # => "http://172.0.0.1:22230/test.action?sign=x6das&foo=bar&joe=doe"
Ваш первоначальный пример использования {"foo":"bar","joe":"doe"}
является JSON сериализованные данные, которые, как правило, не передается в URL, как это. Если вам необходимо создать JSON, начните с начальным хешем:
require 'json'
data = {"foo" => "bar","joe" => "doe"}
data.to_json # => "{\"foo\":\"bar\",\"joe\":\"doe\"}"
to_json
сериализует хэш в строку, которая затем может быть закодирована в URI:
data = {"foo" => "bar","joe" => "doe"}
uri = URI.parse('http://172.0.0.1:22230/test.action?sign=x6das')
query = URI.decode_www_form(uri.query).to_h # => {"sign"=>"x6das"}
uri.query = URI.encode_www_form(query.merge('data' => data.to_json)) # => "sign=x6das&data=%7B%22foo%22%3A%22bar%22%2C%22joe%22%3A%22doe%22%7D"
Но опять же, посылая кодированный JSON поскольку параметр запроса в URI не очень распространен или стандартен, поскольку полезная нагрузка данных меньше без кодировки JSON.
'Nokogiri :: HTML (open ('http://google.com/test?data= {" foo ":" bar "," joe ":" doe "} & sign = x6das'))' => 'OpenURI :: HTTPError: 404 Not Found'. Можете ли вы написать свой URI? – Ilya
@ Ilya Я думаю, что писать оригинальные uri в stackoverflow - плохая идея, но я отредактирую обычный с оригинальным url в своем quetion. – itx
Nokogiri не имеет ничего общего с плохим URI; Он не знает об этом уровне кода и вместо этого только считывает поток, если он передан ему, и анализирует полученную строку. OpenURI или RestClient - это слои, которые будут возвращать эту ошибку. Важно понять, какие компоненты в вашем коде делают. Удалите ссылки и теги для Nokogiri и замените их OpenURI, и ваш вопрос будет иметь больше смысла. –