Das ist ziemlich einfach mit einem einfachen Hash wie
{:a => "a", :b => "b"}
was in übersetzen würde
"a=a&b=b"
Aber was machst du mit etwas Komplexerem wie
{:a => "a", :b => ["c", "d", "e"]}
was übersetzen sollte in
"a=a&b[0]=c&b[1]=d&b[2]=e"
Oder noch schlimmer (was zu tun ist) mit so etwas wie:
{:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
Vielen Dank für die sehr geschätzte Hilfe dabei!
ruby
http
parameters
hashmap
Julien Genestoux
quelle
quelle
Antworten:
Update: Diese Funktionalität wurde aus dem Edelstein entfernt.
Julien, deine Selbstantwort ist gut, und ich habe sie schamlos entlehnt, aber sie entgeht reservierten Charakteren nicht richtig, und es gibt einige andere Randfälle, in denen sie zusammenbricht.
Das Juwel ist " adressierbar "
quelle
query_values
Mutator unterstützt.Für einfache, nicht verschachtelte Hashes hat Rails / ActiveSupport
Object#to_query
.http://api.rubyonrails.org/classes/Object.html#method-i-to_query
quelle
require 'active_support/all'
wird benötigtto_query
Nullwerte nicht richtig behandelt.{ a: nil, b: '1'}.to_query == "a=&b=1"
, aber Rack und CGI werden beidea=
als leere Zeichenfolge analysiert , nichtnil
. Ich bin mir nicht sicher, ob andere Server unterstützt werden, aber bei Rails sollte die richtige Abfragezeichenfolge lautena&b=1
. Ich denke, es ist falsch, dass Rails keineWenn Sie Ruby 1.9.2 oder höher verwenden, können Sie verwenden,
URI.encode_www_form
wenn Sie keine Arrays benötigen.ZB (aus den Ruby-Dokumenten in 1.9.3):
Sie werden feststellen, dass Array-Werte nicht mit Schlüsselnamen festgelegt werden, die
[]
so enthalten, wie wir es alle in Abfragezeichenfolgen gewohnt sind. Die verwendete Spezifikationencode_www_form
entspricht der HTML5-Definition vonapplication/x-www-form-urlencoded
Daten.quelle
{:c => "c", :d => true}
scheint inspiziert zu sein, also als String durchgeschickt.ruby -ruri -e 'puts RUBY_VERSION; puts URI.encode_www_form({:a => "a", :b => {:c => "c", :d => true}, :e => []})' # outputs 2.0.0 a=a&b=%7B%3Ac%3D%3E%22c%22%2C+%3Ad%3D%3Etrue%7D&
Addressable::URI
und ActiveSupportsObject#to_query
.Sie müssen den aufgeblähten ActiveSupport nicht laden oder Ihren eigenen rollen, Sie können
Rack::Utils.build_query
und verwendenRack::Utils.build_nested_query
. Hier ist ein Blog-Beitrag , der ein gutes Beispiel gibt:Es werden sogar Arrays verarbeitet:
Oder das schwierigere verschachtelte Zeug:
quelle
:b
besteht es aus einem Array von zwei Hashes. Am Ende ist:b
es eine Reihe von einem größeren Hash.require 'rack'
? Es muss vorhanden sein, wenn man bedenkt, dass alle wichtigen Ruby-Webframeworks jetzt auf Rack basieren.to_query
auch die beiden Arrays zusammen (v4.2).Von Merb stehlen:
Siehe http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html
quelle
Hier ist ein kurzer und süßer Liner, wenn Sie nur einfache ASCII-Schlüssel- / Wert-Abfragezeichenfolgen unterstützen müssen:
quelle
quelle
Hier ist ein anderer Weg. Für einfache Fragen.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich wollte nur diesen Code posten, da ich kein einfaches Juwel finden konnte, um genau diese Aufgabe für mich zu erledigen.
Hier als Juwel aufgerollt: https://github.com/simen/queryparams
quelle
URI.escape != CGI.escape
und für die URL möchten Sie die erste.CGI.escape("http://localhost/search?q=banana&limit=7")
=> "http%3A%2F%2Flocalhost%2Fsearch%3Fq%3Dbanana%26limit%3D7"
URI.escape("http://localhost/search?q=banana&limit=7")
=> "http://localhost/search?q=banana&limit=7"
Der beste Ansatz ist die Verwendung von Hash.to_params, das mit Arrays einwandfrei funktioniert.
quelle
require 'active_support/all'
wird benötigtWenn Sie sich im Kontext einer Faraday-Anfrage befinden, können Sie auch einfach den Parameter-Hash als zweites Argument übergeben. Faraday sorgt dafür, dass die richtige Parameter-URL daraus wird:
quelle
Ich benutze dieses Juwel gerne:
https://rubygems.org/gems/php_http_build_query
Beispielnutzung:
quelle
quelle