2016-04-12 6 views
-1

Ich habe eine URL wie:Verwenden Hash-Wert auf URL mit Nokogiri oder RestClient

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

In meinem Browser kann ich Daten von dieser URL bekommen, aber wenn ich den Einsatz nokogiri

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

ich

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' 

auch mit RestClient

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

Ich habe gleich einen Fehler.

+0

'Nokogiri :: HTML (öffnen ('http://google.com/test?data= {" foo ":" bar "," joe ":" doe "} & sign = x6das')) => 'OpenURI :: HTTPError: 404 nicht gefunden'. Kannst du deine URI schreiben? – Ilya

+0

@Ilya Ich denke, Original uri in Stackoverflow schreiben ist eine schlechte Idee, aber ich werde gemeinsam mit Original-URL in meiner Frage bearbeiten. – itx

+0

Nokogiri hat nichts mit einer schlechten URI zu tun; Es ist sich dieser Codeebene nicht bewusst und liest stattdessen nur den Stream, wenn einer übergeben wird, und analysiert die resultierende Zeichenfolge. OpenURI oder RestClient sind die Layer, die diesen Fehler zurückgeben würden. Es ist wichtig zu verstehen, welche Komponenten in Ihrem Code was tun. Bitte entferne die Referenzen und den Tag für Nokogiri und ersetze sie durch OpenURI und deine Frage ergibt mehr Sinn. –

Antwort

0

Verschlüsseln Sie Ihre URL zuerst, dann verwenden Sie sie.

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

Ich habe 'Errno :: ENAMETOOLONG: Dateiname zu lang @ rb_sysopen' – itx

-1

Ok habe ich mein Problem gelöst

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

Leider wird Ihr Code nicht ausgeführt werden. Sie haben "URL" nicht korrekt deklariert. –

+0

Es geht nicht um declare url, aber wie "ich" lösen kann, um mit url so umzugehen, und ich habe eine brauchbare Lösung für mein Problem gefunden von [dieser Frage] (http://stackoverflow.com/questions/15700784/ how-to-fix-bad-uri-ist-nicht-uri), und das funktioniert für mich. – itx

0

Wenn mit URIs zu tun, ist es eine gute Idee, die Werkzeuge für sie wie URI entworfen zu verwenden, die mit Rubin kommt.

Der URI kann sein, weil nicht

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

die data Komponente ungültig ist. Wenn Sie hinzufügen data dann würde ich beginnen mit:

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" 

Ihr erstes Beispiel mit {"foo":"bar","joe":"doe"} ist JSON serialisierten Daten, die in der Regel nicht in einer URL wie das übergeben wird. Wenn Sie JSON erstellen müssen, mit dem Anfangs-Hash-Start:

require 'json' 

data = {"foo" => "bar","joe" => "doe"} 
data.to_json # => "{\"foo\":\"bar\",\"joe\":\"doe\"}" 

to_json den Hash in einen String serialisiert, die dann in die URI codiert werden:

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" 

Aber auch hier codierte JSON Senden als Abfrageparameter in der URI ist nicht sehr üblich oder Standard, da die Datennutzlast ohne die JSON-Codierung kleiner ist.