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:

  1. 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?

  2. 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&param2=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