Je veux envoyer un URI comme valeur d'un paramètre de requête/matrice. Avant de pouvoir l'ajouter à un URI existant, je dois le coder conformément à la RFC 2396. Par exemple, étant donné l'entrée:
http://google.com/resource?key=value1 & value2
J'attends la sortie:
http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2
Ni Java.net.URLEncoder
ni Java.net.URI
générera la bonne sortie. URLEncoder
est destiné à l'encodage de formulaire HTML qui n'est pas le même que RFC 2396. URI
n'a pas de mécanisme pour encoder une seule valeur à la fois donc il n'a aucun moyen de savoir que value1 et value2 sont partie de la même clé.
riBuilder de Jersey code les composants URI en utilisant application/x-www-form-urlencoded et RFC 3986 selon les besoins. Selon le Javadoc
Les méthodes du générateur effectuent un codage contextuel des caractères non autorisés dans le composant URI correspondant en suivant les règles du type de média application/x-www-form-urlencoded pour les paramètres de requête et RFC 3986 pour tous les autres composants. Notez que seuls les caractères non autorisés dans un composant particulier sont soumis au codage.Par exemple, un chemin fourni à l'une des méthodes de chemin peut contenir des paramètres de matrice ou plusieurs segments de chemin car les séparateurs sont des caractères légaux et ne seront pas codés. Les valeurs codées en pourcentage sont également reconnues là où elles sont autorisées et ne seront pas codées en double.
Vous pouvez également utiliser Spring's riUtils
Je n'ai pas assez de réputation pour commenter les réponses, mais je voulais juste noter que le téléchargement de l'API JSR-311 en lui-même ne fonctionnera pas. Vous devez télécharger l'implémentation de référence ( jersey ).
Seul le téléchargement de l'API à partir de la page JSR vous donnera une exception ClassNotFoundException lorsque l'API essaie de rechercher une implémentation au moment de l'exécution.
J'ai écrit le mien, c'est court, super simple, et vous pouvez le copier si vous le souhaitez: http://www.dmurph.com/2011/01/Java-uri-encoder/
Il semble que CharEscapers de Google GData-Java-client a ce que vous voulez. Il a la méthode uriPathEscaper, uriQueryStringEscaper et uriEscaper générique. (Tous renvoient un objet Escaper qui s'échappe réellement). Licence Apache.