C'est assez facile avec un hachage simple comme
{:a => "a", :b => "b"}
ce qui se traduirait par
"a=a&b=b"
Mais que faites-vous avec quelque chose de plus complexe comme
{:a => "a", :b => ["c", "d", "e"]}
qui devrait se traduire par
"a=a&b[0]=c&b[1]=d&b[2]=e"
Ou pire encore, (que faire) avec quelque chose comme:
{:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]
Merci pour l'aide très appréciée!
ruby
http
parameters
hashmap
Julien Genestoux
la source
la source
Réponses:
Mise à jour: cette fonctionnalité a été supprimée de la gemme.
Julien, votre réponse est bonne, et je l'ai empruntée sans vergogne, mais elle n'échappe pas correctement aux personnages réservés, et il y a quelques autres cas extrêmes où elle tombe en panne.
Le bijou est « adressable »
la source
query_values
mutateur.Pour les hachages de base non imbriqués, Rails / ActiveSupport l'a
Object#to_query
.http://api.rubyonrails.org/classes/Object.html#method-i-to_query
la source
require 'active_support/all'
est nécessaireto_query
ne gère pas correctement les valeurs nulles.{ a: nil, b: '1'}.to_query == "a=&b=1"
, mais Rack et CGI analysent tous les deuxa=
comme une chaîne vide, nonnil
. Je ne suis pas sûr de la prise en charge d'autres serveurs, mais avec les rails, la chaîne de requête correcte devrait êtrea&b=1
. Je pense qu'il est faux que Rails ne puisse pas produire une chaîne de requête correctement analysée par elle-même ...Si vous utilisez Ruby 1.9.2 ou une version ultérieure, vous pouvez l'utiliser
URI.encode_www_form
si vous n'avez pas besoin de tableaux.Par exemple (à partir des documents Ruby en 1.9.3):
Vous remarquerez que les valeurs de tableau ne sont pas définies avec des noms de clé contenant
[]
comme nous sommes tous habitués dans les chaînes de requête. La spécification utiliséeencode_www_form
est conforme à la définition HTML5 desapplication/x-www-form-urlencoded
données.la source
{:c => "c", :d => true}
semble être inspecté, donc envoyé via une chaîne.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
et ActiveSupportObject#to_query
.Pas besoin de charger l'ActiveSupport gonflé ou de rouler le vôtre, vous pouvez utiliser
Rack::Utils.build_query
etRack::Utils.build_nested_query
. Voici un article de blog qui donne un bon exemple:Il gère même les tableaux:
Ou les trucs imbriqués les plus difficiles:
la source
:b
s'agit d'un tableau de deux hachages. Vous vous retrouvez avec:b
un tableau d'un hachage plus grand.require 'rack'
? Il doit être là, étant donné que tous les principaux frameworks Web Ruby sont désormais construits sur Rack.to_query
fusionne également les 2 baies (v4.2).Voler à Merb:
Voir http://noobkit.com/show/ruby/gems/development/merb/hash/to_params.html
la source
Voici une ligne courte et douce si vous ne devez prendre en charge que des chaînes de requête de clé / valeur ASCII simples:
la source
la source
Voici une autre façon. Pour des requêtes simples.
la source
Je sais que c'est une vieille question, mais je voulais juste publier ce morceau de code car je ne pouvais pas trouver un simple bijou pour faire juste cette tâche pour moi.
Enroulé comme un joyau ici: https://github.com/simen/queryparams
la source
URI.escape != CGI.escape
et pour l'URL, vous voulez le premier.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"
La meilleure approche consiste à utiliser Hash.to_params, qui fonctionne correctement avec les tableaux.
la source
require 'active_support/all'
est nécessaireSi vous êtes dans le contexte d'une demande Faraday, vous pouvez également passer le hachage params comme deuxième argument et faraday se charge de faire de l'URL param appropriée une partie de celui-ci:
la source
J'aime utiliser ce bijou:
https://rubygems.org/gems/php_http_build_query
Exemple d'utilisation:
la source
la source