Ruby - le codage d'URL
J'ai une chaîne d'URL où il y a des sauts de ligne et un retour chariot. E. g.
http://xyz.com/hello?name=john&msg=hello\nJohn\n\rgoodmorning¬e=last\night I went to \roger
Où mon msg
chaîne est:
hello
john
goodmorning
et note
chaîne est
last\night I went to \roger
Afin de l'envoyer correctement je urlencode ce
http://xyz.com/hello?name%3Djohn%26msg%3Dhello%5CnJohn%5Cn%5Crgoodmorning%26note%3Dlast%5Cnight%20I%20went%20to%20%5Croger
Mais cette encoder gâcher \n et \r. Alors que je m'attends \n devriez obtenir converti %0A et \r pour %0D
Je suis à l'écriture de code est ruby. Et j'ai essayé de prendre l'aide de Addressable::URI
mais aucune aide n'est pas encore. Autre moyen pourrait être de remplacer \n et \r manuellement à l' %0A et %0D respectivement. Mais ce remplacement peut remplacer les caractères valides comme last\night
à last%0Aight
que je ne veux pas. Quelqu'un peut-il suggérer une meilleure solution? Merci.
OriginalL'auteur JVK | 2013-01-04
Vous devez vous connecter pour publier un commentaire.
Ce sujet
CGI::escape
Il vous suffit d'encoder les paramètres.
Je pensais à écrire monkey patching
Class Hash def to_query self.map{|k,v| "#{CGI.escape(k)}=#{CGI.escape(v)}"}.join(“&”) end end
de sorte que je peux utiliserhash.to_query
mais il l'habitude de travailler becaus eof raison évidente "CGI" et jeter erreur NameError: uninitialized constant Hash::CGI est-il un moyen de le résoudre.Tout d'abord, ne voyez-vous pas que
CGI
est aussi échapper à la "& " s ? Si vous voulez faire quelque chose comme cela, vous devez également être sûr quek
etv
sont des chaînes de caractères sinonCGI::escape
déclenchera une erreur. Et enfin, je n'ai eu aucun problème de le tester en local. Vous avez une drôle de"
dans votre.join(“&”)
et vous pourriez essayer d'ajouter::
en face deCGI
comme::CGI
.OriginalL'auteur oldergod
C'est ce que je pourrais faire à l'aide de Adressable::URI:
Qui retourne:
La
\r
dans\roger
et\n
dans\night
sont converties car j'ai utilisé un guillemet double chaîne délimitée, au lieu d'un seul-devis chaîne délimitée, ce qui aurait préservé\r
et\n
que des littéraux.OriginalL'auteur the Tin Man
Passant json, des citations etc dans la requête GET est délicate. En Ruby 2+, nous pouvons utiliser Ruby URI du module de "s'échapper" de la méthode.
Mais je suggère de l'utiliser comme une requête POST et de le passer comme un corps de message.
OriginalL'auteur Abhi