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.
'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
@Ilya Ich denke, Original uri in Stackoverflow schreiben ist eine schlechte Idee, aber ich werde gemeinsam mit Original-URL in meiner Frage bearbeiten. – itx
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. –