Le codage URL vers URI change un «% 3D» en «% 253D»

Je n’arrive pas à encoder une URL dans un URI:

mUrl = "A ssortingng url that needs to be encoded for use in a new HttpGet()"; URL url = new URL(mUrl); URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(), url.getQuery(), null); 

Cela ne fait pas ce que j’attends pour l’URL suivante:

En passant dans la corde:

http://m.bloomingdales.com/img?url=http%3A%2F%2Fimages.bloomingdales.com%2Fis%2Fimage%2Fproducts%2F3%2Foptimized%2F1140443_fpx.tif%3Fwid%3D52%26%26. 2C0% 26couche% 3Dcomp% 26op_sharpen% 3D0% 26resMode% 3Dsharp2% 26op_usm% 3D0.7% 2C0.5% 2C0% 26fmt% 3Djpeg & ttl = 30d

Vient comme:

http://www.bloomingdales.com/img?url=http%253A%252F%252Fimages.bloomingdales.com%252Fis%252Fimage%252FBLM%252Fproducts%252F3%252Foptimized%252F1140F3++++. 252C0% 2526layer% 253Dcomp% 2526op_sharpen% 253D0% 2526resMode% 253Dsharp2% 2526op_usm% 253D0.7% 252C1.0% 252C0.5% 252C0% 252C0% 2526fm_t25% 2526fm_25m% 253D0 =%

Qui est cassé. Par exemple, le %3D est transformé en %253D Il semble faire quelque chose de mystérieux pour les% déjà dans la chaîne.

Qu’est-ce qui se passe et qu’est-ce que je fais mal ici?

Vous commencez par placer la chaîne (déjà échappée) dans la classe d’ URL . Cela n’échappe à rien. Ensuite, vous extrayez des sections de l’ URL , qui les renvoient sans traitement supplémentaire (donc, elles sont toujours échappées car elles ont été échappées lorsque vous les avez insérées). Enfin, vous insérez les sections dans la classe URI à l’aide du constructeur multi-argument . Ce constructeur est spécifié pour coder les composants URI à l’aide de pourcentages.

C’est donc dans cette dernière étape que, par exemple, ” : ” devient ” %3A ” (bon) et ” %3A ” devient ” %253A ” (mauvais). Puisque vous insérez des URL déjà encodées *, vous ne voulez plus les encoder.

Par conséquent, le constructeur d’ URI seul argument est votre ami. Cela n’échappe à rien et nécessite que vous transmettiez une chaîne pré-échappée. Par conséquent, vous n’avez pas du tout besoin d’ URL :

 mUrl = "A ssortingng url is already percent-encoded for use in a new HttpGet()"; URI uri = new URI(mUrl); 

* Le seul problème est que vos URL ne sont parfois pas encodées en pourcentage, mais parfois. Ensuite, vous avez un plus gros problème. Vous devez décider si votre programme démarre avec une URL toujours codée ou une URL devant être codée.

Notez qu’il n’existe pas d’ URL complète qui ne soit pas codée en pourcentage. Par exemple, vous ne pouvez pas utiliser l’URL complète ” http://example.com/bob&co ” pour la transformer en une URL correctement codée ” http://example.com/bob%26co ” – comment pouvez-vous dire la différence entre la syntaxe (qui ne devrait pas être échappé) et les caractères (qui devrait)? C’est pourquoi la forme d’ URI un seul argument nécessite que les chaînes soient déjà échappées. Si vous avez des chaînes non échappées, vous devez les encoder au pourcentage avant de les insérer dans la syntaxe complète de l’URL, et c’est ce que le constructeur multi-arguments d’ URI vous aide à faire.

Edit: j’ai manqué le fait que le code original supprime le fragment. Si vous souhaitez supprimer le fragment (ou toute autre partie) de l’URL, vous pouvez construire l’ URI comme ci-dessus, puis extraire toutes les parties comme il convient (elles seront décodées en chaînes ordinaires), puis les renvoyer dans l’ URI constructeur multi-argument (où ils seront recodés en tant que composants URI):

 uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), null) // Remove fragment 

La classe d’ URL n’a pas décodé les%-séquences lorsqu’elle a analysé l’URL, mais la classe d’ URI les code (à nouveau). Utilisez l’ URI pour parsingr la chaîne d’URL.

Javadocs:

http://download.oracle.com/javase/6/docs/api/java/net/URL.html

La classe d’URL n’encode ni ne décode aucun composant d’URL conformément au mécanisme d’échappement défini dans la RFC2396. Il incombe à l’appelant de coder tous les champs à échapper avant d’appeler une URL et de décoder tous les champs échappés renvoyés depuis une URL. De plus, comme l’URL n’a aucune connaissance de l’échappement d’URL, elle ne reconnaît pas l’équivalence entre la forme codée ou décodée de la même URL. Par exemple, les deux URL:

 http://foo.com/hello world/ and http://foo.com/hello%20world 

serait considéré non égal les uns aux autres. Notez que la classe URI échappe à ses champs de composant dans certaines circonstances.

La méthode recommandée pour gérer le codage et le décodage des URL consiste à utiliser l’URI et à effectuer la conversion entre ces deux classes à l’aide de toURI () et de URI.toURL ().

% 3d signifie-> = (égal)

Et

% 253D -> = (égal) décimal 6hex (octet) 3D

Indicateur hexadécimal % 253D pour CGI: % 3D

Ce qui se passe ici, c’est que les signes % de la première URL sont échappés, ce qui signifie qu’ils sont transformés en %25 dans la sortie. Vous devez mettre en place des précautions afin que votre script ne contienne que des caractères alphanumériques, ainsi que certains symboles, mais pas encore des caractères échappés.

Voici quelques personnages qui ont besoin de s’échapper:

 < > " ! # $ ' ( ) * , - . / : ; @ [ \ ] ^ _ ` { | } ~ 

Les autres caractères, tels que = , % , et & et les caractères alphanumériques, ne le sont pas.