Quelles sont les différences et lequel devrais-je utiliser?
Réponses
Trop de publicités?Quelle est la différence entre la hache et l'épée et celui que je devrais utiliser? Eh bien, il dépend de ce que vous devez faire.
URI.escape
a été censé pour encoder la chaîne (URL), ainsi appelé, % - encodage.
CGI::escape
vient de CGI spec de la façon dont les données doivent être codées/décodage entre le serveur web et l'application.
Maintenant, disons que vous avez besoin pour échapper à URI dans votre application. Il est plus précis en cas d'utilisation.
Pour que la communauté ruby utilisé URI.escape
depuis des années. Le problème avec URI.escape
a été qu'il ne pouvait pas affronter le RFC 3896 spec.
URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog"
URI.escape
a été marqué comme obsolète:
En outre URI en cours.l'encodage est simple gsub. Mais je pense qu'il devrait diviser un URI de composants, puis échapper à chaque composants, et enfin se joindre à eux.
Donc les URI.coder est considéré comme dangereux et obsolète. Ce sera être retiré ou un changement de comportement de façon drastique.
Qu'est-ce que le remplacement en ce moment?
Comme je l'ai dit ci-dessus, URI en cours.l'encodage est mauvais sur spec. Nous avons donc ne pas fournir le remplacement exact. Le remplacement varient par son cas d'utilisation.
Malheureusement, il n'existe pas un seul mot à ce sujet dans la doc, la seule façon de le savoir est de vérifier la source, ou d'exécuter le script avec des avertissements dans le niveau de détail (ou d'utiliser certains de google-fu).
Certains proposé d'utiliser CGI::Escape
pour les paramètres de la requête, parce que vous ne pouvais pas échapper à toute URI:
CGI::escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http%3A%2F%2Fgoogle.com%2Ffoo%3Fbar%3Dat%23anchor%26title%3DMy+Blog+%26+Your+Blog"
CGI::escape
doit être utilisé pour les paramètres de la requête seulement, mais les résultats seront, de nouveau, à l'encontre de la spec. En fait l'utilisation la plus courante de cas s'échappe forme de données codées (f.j'. lors de l'envoi d' application/x-www-form-urlencoded
de la requête POST).
Également mentionné WEBrick::HTTPUtils.escape
n'est pas beaucoup d'amélioration (à nouveau son de simples gsub, l'omi encore pire que de URI.escape):
WEBrick::HTTPUtils.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at%23anchor&title=My%20Blog%20&%20Your%20Blog"
Le plus proche de la spec semble être Adressable gem:
require 'addressable/uri'
Addressable::URI.escape 'http://google.com/foo?bar=at#anchor&title=My Blog & Your Blog'
# => "http://google.com/foo?bar=at#anchor&title=My%20Blog%20&%20Your%20Blog"
Avis, contrairement à tous les précédents, Adressable ne pas échapper #
, et ce comportement est normal (vous voulez garder l' #
de hachage dans le chemin de l'URI, mais pas dans l'URI de la requête).
Le seul problème reste, c'est que nous n'avons pas échappé à notre paramètres de requête correctement. La nous amène à la conclusion: il ne faut pas utiliser de méthode unique pour l'ensemble de l'URI, car il n'y a pas de solution parfaite (jusqu'à présent).
Comme vous le voyez &
a pas échappé à "Mon Blog Et de Votre Blog". Nous avons besoin d'utiliser la forme différente de s'échapper, pour requête de paramètres, où les utilisateurs peuvent mettre les différents caractères qui ont une signification spéciale dans les Url. Entrez l'url de l'encodage. Encoder doit être utilisé pour tous les "suspects" valeur de la requête, comme n' ERB::Util.url_encode
:
ERB::Util.url_encode "My Blod & Your Blog"
# => "My%20Blod%20%26%20Your%20Blog""
C'est cool mais nous avons déjà requis Adressable:
uri = Addressable::URI.parse("http://www.go.com/foo")
# => #<Addressable::URI:0x186feb0 URI:http://www.go.com/foo>
uri.query_values = {title: "My Blog & Your Blog"}
uri.normalize.to_s
# => "http://www.go.com/foo?title=My%20Blog%20%26%20Your%20Blog"
Conclusion:
- Ne pas utiliser
URI.escape
ou similaire - Utiliser des CGI::escape si vous avez seulement besoin de formulaire échapper
- Si vous avez besoin de travailler avec les Uri, utilisez Adressable, il propose l'encodage de l'url, formulaire d'encodage et normalise les Url.
- Si c'est des Rails de projet de vérifier http://stackoverflow.com/a/13626484/409475
Il y avait quelques petites différences, mais le point important est qu' URI.escape
a été déprécié en Ruby 1.9.2... alors utiliser CGI::escape
ou ERB::Util.url_encode.
Il y a une longue discussion sur ruby-core pour ceux qui sont intéressés qui mentionne aussi WEBrick::HTTPUtils.s'échapper et WEBrick::HTTPUtils.escape_form.
URI.échapper prend un deuxième paramètre qui vous permet de marquer ce qui est dangereux. Voir APIDock:
CGI::escape
est bon pour échapper segment de texte de sorte qu'ils peuvent être utilisés dans les url des paramètres de la requête (les chaînes après le '?'). Par exemple, si vous voulez avoir paramètre contenant des caractères barre oblique dans l'url, vous CGI::escape (en chaîne) d'abord, puis l'insérer dans l'url.
Cependant dans les Rails, vous n'aurez probablement pas l'utiliser directement. En général, vous utilisez hash.to_param
, qui utilisera CGI::escape
sous le capot.
URI::escape
est bon pour échapper à une url qui n'a pas échappé correctement. Par exemple, certains sites de sortie de mal/non échappés url dans leur balise d'ancrage. Si votre programme, utilisez ces url pour récupérer plus de ressources, OpenURI va se plaindre que les url ne sont pas valides. Vous avez besoin d' URI::escape
ces pour en faire une url valide. Il est donc utilisé pour échapper à l'ensemble de la chaîne URI pour le rendre bon. Dans ma parole URI::ne pas encoder rend une url lisible par l'homme, et URI::échapper à fait valable pour les navigateurs.
Ce sont mes profane du terme et n'hésitez pas à corriger ceux-ci.