Dans Ruby / Rails, comment puis-je encoder / échapper des caractères spéciaux dans les URL?
Comment puis-je encoder ou de "s'échapper" de l'URL avant j'utiliser OpenURI à open(url)
?
Nous utilisons OpenURI pour ouvrir une url distante et retour le xml:
getresult = open(url).read
Le problème est que l'URL contient de l'utilisateur-saisir le texte qui contient des espaces et autres caractères, y compris les "+", "&", "?", etc. potentiellement, nous avons donc besoin de sortir en toute sécurité de l'URL. J'ai vu beaucoup d'exemples lors de l'utilisation de Net::HTTP, mais n'ont pas trouvé tout de OpenURI.
Nous devons également être en mesure d'onu-échapper à une chaîne similaire nous recevoir dans une variable de session, donc nous avons besoin de la fonction réciproque.
source d'informationauteur jpwynn | 2011-02-11
Vous devez vous connecter pour publier un commentaire.
Ruby intégré URI bibliothèque, et le Adressable gem, en particulier Adressable::URI
Je préfère Adressable::URI. Il est très complet et gère l'encodage pour vous lorsque vous utilisez le
query_values=
méthode.J'ai vu des discussions sur l'URI en passant par des douleurs de croissance donc j'ai tendance à le laisser seul pour le traitement de l'encodage/s'échapper jusqu'à ce que ces choses rentrer dans l'ordre:
Ne pas utiliser
URI.escape
comme il a été déprécié en 1.9.Rails le Soutien Actif ajoute
Hash#to_query
:Aussi, comme vous pouvez le voir, il essaie de commander les paramètres de la requête toujours de la même manière, ce qui est bon pour le cache HTTP.
Ruby Standard de la Bibliothèque à la rescousse:
Voir plus à la docs pour l'URI::module d'évacuation. Il possède également une méthode pour faire l'inverse (
unescape
)La principale chose que vous devez considérer est que vous devez sortir les clés et les valeurs séparément avant vous composez vous-même l'URL complète.
Toutes les méthodes utilisées pour obtenir l'adresse URL complète et essayer de s'échapper par la suite sont brisés, parce qu'ils ne peuvent pas dire si tous les
&
ou=
personnage était censé être un séparateur, ou peut-être une partie de la valeur (ou une partie de la clé).La bibliothèque CGI semble faire du bon travail, sauf pour l'espace, qui était traditionnellement codé comme
+
et, aujourd'hui, doit être codé comme%20
. Mais c'est une solution facile.S'il vous plaît, considérez les points suivants: