2016-04-12 7 views
-1

У меня есть URL, как:значение использования Hash на URL с Nokogiri или RestClient

http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das

В моем браузере я могу получить данные из этого URL, но если я использовать nokogiri

Nokogiri::HTML(open('http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das')) 

я

URI::InvalidURIError: bad URI(is not URI?): http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das 
from /home/worka/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/uri/common.rb:176:in `split' 

Также с RestClient

RestClient.get 'http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das' 

У меня такая же ошибка.

+0

'Nokogiri :: HTML (open ('http://google.com/test?data= {" foo ":" bar "," joe ":" doe "} & sign = x6das'))' => 'OpenURI :: HTTPError: 404 Not Found'. Можете ли вы написать свой URI? – Ilya

+0

@ Ilya Я думаю, что писать оригинальные uri в stackoverflow - плохая идея, но я отредактирую обычный с оригинальным url в своем quetion. – itx

+0

Nokogiri не имеет ничего общего с плохим URI; Он не знает об этом уровне кода и вместо этого только считывает поток, если он передан ему, и анализирует полученную строку. OpenURI или RestClient - это слои, которые будут возвращать эту ошибку. Важно понять, какие компоненты в вашем коде делают. Удалите ссылки и теги для Nokogiri и замените их OpenURI, и ваш вопрос будет иметь больше смысла. –

ответ

0

Сначала кодируйте ваш URL-адрес, затем используйте его.

url = 'http://172.0.0:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das' 
encoded_url = CGI::escape(url) 
Nokogiri::HTML(open(encoded_url)) 
+0

У меня есть «Errno :: ENAMETOOLONG: слишком длинное имя файла @ rb_sysopen' – itx

-1

Ok я получил решить мою проблему

url = http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das 
RestClient.get(URI.encode(url.strip)) 
+1

К сожалению, ваш код не запускается. Вы не указали «url» правильно. –

+0

Речь идет не о объявлении url, а о том, как «я» могу решить эту проблему, и я нашел полезное решение для своей проблемы из [этого вопроса] (http://stackoverflow.com/questions/15700784/ как-к-fix-bad-uri-is-not-uri), и это работает на меня. – itx

0

При работе с 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.