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:
sort comme suit:
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?
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
% 3D signifie-> = (égal)
Et
% 253d -> = (égal) décimal 6hex (octet) 3D
% 253d Indicateur hexagonal pour CGI: % 3D
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 ().