web-dev-qa-db-fra.com

URL à l'encodage URI modifie un "% 3D" à "% 253d"

J'ai du mal à encoder une URL à une URI:

mUrl = "A string 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:

Passer dans la chaîne:

http://m.bloomingdales.com/img?url=http%3a%2f%2Fimages.bloomingdales.com%2FIS%2FIMAGE%2FBLM%2FPRODUCTS%2F3%2FOPTIMized%2F1140443_FPX .tif% 3fwid% 3D52% 26QLT% 3D90% 2C0% 26Layer% 3DCOMP% 26OP_SHARPEN% 3D0% 26RESMode% 3DSHARP2% 26OP_USM% 3D0.7% 2C1.0% 2C0.5% 2C0% 26FMT% 3DJPEG & TTL = 30D

sort comme suit:

http://m.bloomingdales.com/img?url=http%253a%252f%252fimages.bloomingdales.com%252FIS%252FIMAGE%252FBLM%252FPRODUCTS%252F3%252FOPTIMized%252F1140443_FPX .tif% 253fwid% 253d52% 2526qlt% 253d90% 252C0% 2526Layer% 253dcompue% 2526OP_SHARPEN% 253D0% 2526RESMode% 253DSHARP2% 253D0.0% 252C1.0% 252C0.5% 252C0% 2526FMT% 253DJPEG & TTL = 30D

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

Qu'est-ce qui se passe et que dois-je me tromper ici?

13
cottonBallPaws

Vous devez d'abord mettre la chaîne (déjà échappée) dans la classe URL. Cela n'échappe à rien. Ensuite, vous tirez des sections du URL, qui les renvoie sans autre traitement (donc - ils sont toujours échappés car ils se sont échappés lorsque vous les mettez). Enfin, vous mettez les sections dans la classe URI, en utilisant le Constructeur multi-arguments . Ce constructeur est spécifié en tant que codage des composants URI à l'aide des pourcentages.

Par conséquent, c'est dans cette dernière étape qui, par exemple, ":" devient "%3A" (bon et "%3A" devient "%253A "(mauvais). Puisque vous mettez en URL qui sont déjà codés *, vous ne voulez pas les encoder à nouveau.

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

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

* Le seul problème est que si vos URL ne sont parfois pas codées, et parfois elles sont. Ensuite, vous avez un problème plus gros. Vous devez décider si votre programme commence par une URL toujours codée, ou celle qui doit être codée.

Notez qu'il y a non de telle chose comme une URL complète qui n'est pas codée pourcentage. Par exemple, vous ne pouvez pas prendre l'URL complète "http://example.com/bob&co "Et la transformer en quelque sorte dans l'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ée) et les personnages (qui devrait)? C'est pourquoi la forme d'argument unique de URI exige que les chaînes soient déjà -Enscaped. Si vous avez des chaînes non évaluées, vous devez le coder pourcendre avant Insérez-les dans la syntaxe complète de l'URL, et c'est ce que le constructeur multi-argument de URI vous aide à faire.

Edit: J'ai raté le fait que le code d'origine ne résout le fragment. Si vous souhaitez supprimer le fragment (ou une autre partie) de l'URL, vous pouvez construire le URI comme ci-dessus, puis tirer toutes les pièces au besoin (ils seront décodé dans des chaînes régulières), puis transmettez-les dans le constructeur URI multi-arguments (où ils seront re-encodés Composants URI):

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

% 3D signifie-> = (égal)

Et

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

% 253d Indicateur hexagonal pour CGI: % 3D

5
Sarat Patel

La classe URL N'a pas décodé les% de présence lorsqu'elle a analysé l'URL, mais la classe URI est codée (à nouveau). Utilisez URI pour analyser la chaîne d'URL.

Javadocs:

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

La classe d'URL ne codé pas et ne décode-t-elle pas de composants d'URL Selon le mécanisme d'échappement défini dans RFC2396. Il incombe à l'appelant d'encoder n'importe quel champ, qui doit être échappé avant d'appeler l'URL, ainsi que de décoder tous les champs évadés, renvoyés de l'URL. En outre, étant donné que l'URL ne connaissait pas l'URL s'échappant, 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é comme non égal à l'autre. Remarque, la classe URI effectue une échappée de ses champs de composants dans certaines circonstances.

Le ​​moyen recommandé de gérer le codage et le décodage des URL consiste à utiliser URI et à convertir entre ces deux classes à l'aide de Touri () et de l'URI.TOURL ().

4
Bert F