Correctement l'encodage des caractères dans l'URL lors de l'utilisation de HttpClient
J'ai une liste d'Url que j'ai besoin de vérifier sont des Url valides. J'ai écrit un programme en Java qui utilise Apache HttpClient pour vérifier le lien. J'ai dû mettre en place mon propre de redirection de la stratégie en raison de la présence de caractères non valides (comme {} dans l'URL de redirection) que le défaut stratgey n'a pas pris soin de. Il fonctionne très bien dans la majorité des cas, à l'exception de 2 d'entre eux:
- Des Caractères d'échappement dans la voie de requête ou de l'params, qui ne doit pas être codé plus loin. Exemple:
String url = "http://www.example.com/chapter1/%3Fref%3Dsomething%26term%3D?ref=xyz"
Si j'utilise une URI de l'objet, elle s'étouffe sur le "{" caractère.
URI myUri = new URI(url) ==> This will fail.
Si je lance:
URI myUri = new URI(UriUtils.encodeHttpUrl(url))
il encode l' %3F %253F.
Cependant, quand j'ai suivi le lien à l'aide de Chrome ou Fiddler, je ne vois pas %3F arriver s'échappa encore. Comment puis-je protéger de l'encodage de la trajectoire ou de la requête params? - La dernière requête de paramètre dans l'URL est une URL valide. Par exemple.
String url = "www.example.com/Chapter1/?param1=xyz¶m2=http://www.google.com/?abc=1"
Ma stratégie de codage divise la requête params, puis appelle URLEncoder.encoder sur la requête params. Toutefois, cela provoque le dernier param être codé ainsi (ce qui n'est pas le cas lorsque je l'ai suivi dans un violon ou Chrome).
J'ai essayé un certain nombre de choses (à l'aide de UriUtils, les cas particuliers pour les Url en dernier param et autres hacks) mais rien ne semble être idéal. Quel est le meilleur moyen de résoudre ce problème?
OriginalL'auteur smm100 | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas "protéger de la plus-encoding". Vous encoder, ou vous n'avez pas. Vous devez toujours savoir, pour chaque chaîne, si elle est codée ou non. Vous ne devez encoder les chaînes qui ne sont pas encore codé, et vous ne devriez jamais coder les chaînes qui sont déjà encodés.
Est donc cette chaîne codée ou non?
Il me semble que c'est une mauvaise entrée: évidemment, ce n'est pas codé parce qu'il contient des caractères non valides ('{' et '}'). Pourtant, il semble également ne pas être un clair de la chaîne, parce qu'il contient "%xx' des séquences. C'est donc en partie codée. Il n'y a pas de programmatiques "solution" une fois qu'une chaîne est sous cette forme -- vous avez simplement besoin d'éviter d'obtenir une chaîne de caractères dans une telle forme, en premier lieu. Vous pourriez être en mesure de construire un algorithme qui résout cette chaîne, par attentivement à la recherche de pièces de regarder comme un "%" suivi de deux chiffres hexadécimaux, et de le laisser seul. Mais ce sera briser sur de subtils cas. Envisager une forme non codée chaîne "42%23", qui est censé être une représentation littérale de l'expression mathématique "42 mod 23". Quand j'ai mis cela dans une URI, j'attends qu'il encode en tant que "42%2523" de sorte qu'il décode que "42%23", mais l'algorithme ci-dessus se rompre et l'encoder en tant que "42%23" qui seront ensuite décoder comme "42#". Donc, il n'y a pas moyen de corriger au-dessus de la chaîne. "Codage%3F" "%253F" est exactement ce qu'est un URI codeur doit être en train de faire.
Note: ceci dit, les navigateurs vous permettent souvent de s'en tirer avec de frappe de mauvais caractères dans les Uri et ils encoder automatiquement. Ce n'est pas très robuste, de sorte qu'il ne devrait pas être utilisé, sauf si vous essayez d'être très indulgent de la saisie de l'utilisateur. Dans ce cas, vous pouvez faire un "best-effort" en première décodage l'URI et puis de le ré-encoder. Dans ce cas, si je voulais de type "42%23" je dois taper manuellement dans "42%2523".
Comme pour la question 2:
De la même façon, c'est exactement ce que vous voulez. Si un URI apparaît comme un paramètre à l'intérieur d'un URI, il devrait être pour cent codé. Sinon, comment pouvez-vous dire où l'on URI se termine et l'autre continue? Je crois que ce qui précède URI est en fait valide (depuis ':', '/', '&' et '=' caractères réservés, l'interdit pas, et, par conséquent, ils sont autorisés à condition qu'ils ne créent pas d'ambiguïté). Mais il est beaucoup plus sûr d'avoir une URI à l'intérieur d'une URI échappé.
Qu'entendez-vous ", sauf lorsqu'il y a une URL dans le dernier param"?
URLEncoder.encode("http://www.google.com/?abc=1")
donne"http%3A%2F%2Fwww.google.com%2F%3Fabc%3D1"
, ce qui est correct. Vous ne devriez pas mettre une URL dans un paramètre de requête sans premier encodage, ou des comportements étranges vont se produire en cas de coin.avait un bug dans mon dispositif d'ensemble. Cette réponse m'a aidé à dos d'étape et de les analyser de nouveau.
OriginalL'auteur mgiuca
Je ne sais pas vraiment, mais vous pouvez essayer d'abord de le décoder, de sorte que le
%3F
sera récupère ce qu'elle est, et puis l'encoder en arrière.Donc:
OriginalL'auteur Martijn Courteaux
La bonne façon de coder une forme non codée chaîne d'URL est par l'intermédiaire d'URI.toASCIIString().
Bien sûr c'est à vous de décider si l'URL est déjà codé ou pas.
OriginalL'auteur user207421
Avez-vous essayé d'utiliser le URLEncoder?
En plus de cela, votre seule option est de coder chaque URL qui est utilisé comme un paramater séparément, et ensuite manuellement la construction de l'URL. C'est une question assez délicate affaire.
Il n'y a pas une telle chose comme "l'encodage des Url", seul l'encodage des arguments de l'URL. Comme je l'ai dit dans ma réponse, une fois que vous avez une URL, vous ne pouvez pas encoder -- c'est déjà codé, ou que vous avez raté votre chance. Vous avez besoin d'encoder les parties de l'URL avant de construire il. URLEncoder est bon pour le codage de la seule chose qu'il est utile de coder.
Vous êtes de nouveau trompé. Il est certainement une chose telle que l'encodage des Url. C'est ce qu' %20 est, par exemple: codage de l'espace. Voir la RFC 2396, et la Javadoc de java.net.URI.
Je vous assure que je suis tout à fait familier avec la RFC 3986 (qui obsoletes 2396) (j'ai écrit urllib.l'analyser.citation/" en Python 3). Je ne suis pas certain que %20 est utilisé pour encoder les octets dans les Url. Je l'ai dit il n'y a pas une telle chose comme l'encodage des Url, seuls les arguments de l'URL. RFC ne mentionne jamais l'encodage des Url, seul l'encodage octets. Il dit: "le conflit de données doit être pour cent codé avant l'URI est formé" (l'emphase est mienne). java.net.URI(String) s'attend à un déjà codé URI-que le multi-argument constructeur effectue l'encodage.
alors, quel est votre nom pour le processus d'ajout d' %-codé en hexadécimal chaînes d'Url à la place de la sortir de la bande de caractères?
OriginalL'auteur spierce7