Comment encoder les valeurs des paramètres URI?
je veux envoyer un URI comme valeur d'un paramètre de requête/matrice. Avant de pouvoir l'ajouter à une URI existante, je dois l'encoder selon la RFC 2396. Par exemple, compte tenu de l'entrée:
http://google.com/resource?key=value1 & value2
je m'attends à la sortie:
http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2
ni java.net.URLEncoder
ni java.net.URI
ne générera la bonne sortie. URLEncoder
est destiné à l'encodage de formulaires HTML qui n'est pas le même que RFC 2396. URI
n'a aucun mécanisme pour encoder une seule valeur à la fois, donc il n'a aucun moyen de savoir que value1 et value2 font partie de la même clé.
7 réponses
Jersey UriBuilder code les composants URI en utilisant application / x-www-form-urlencoded et RFC 3986 si nécessaire. Selon le Javadoc
méthodes de constructeur effectuer l'encodage contextuel des caractères non autorisés dans le composant URI correspondant en suivant les règles de l'application/x-www-form-urlencoded media type 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 les composants particuliers sont sujets à encodage, par exemple, un chemin fourni à l'une des méthodes de chemin peut contenir des paramètres de matrice ou des segments de chemin multiples puisque les séparateurs sont des caractères légaux et ne seront pas encodés. Les valeurs codées en pourcentage sont également reconnues lorsque cela est permis et ne seront pas codées en double.
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 par lui-même ne fonctionnera pas. Vous devez télécharger l'implémentation de référence ( jersey ).
télécharger uniquement l'api à partir de la page JSR vous donnera une ClassNotFoundException lorsque l'api essaie de rechercher une implémentation à l'exécution.
j'ai écrit le mien, il est court, super simple, et vous pouvez le copier Si vous voulez: 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 les objets Escaper de retour qui ne réelle échappée). Licence Apache.
Mmhh je sais que vous avez déjà écarté URLEncoder, mais malgré ce que disent les docs, j'ai décidé de l'essayer.
vous avez dit:
par exemple, avec une entrée:
http://google.com/resource?key=value
j'attends la sortie:
http % 3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue
:
C:\oreyes\samples\java\URL>type URLEncodeSample.java
import java.net.*;
public class URLEncodeSample {
public static void main( String [] args ) throws Throwable {
System.out.println( URLEncoder.encode( args[0], "UTF-8" ));
}
}
C:\oreyes\samples\java\URL>javac URLEncodeSample.java
C:\oreyes\samples\java\URL>java URLEncodeSample "http://google.com/resource?key=value"
http%3A%2F%2Fgoogle.com%2Fresource%3Fkey%3Dvalue
comme prévu.
Quel serait le problème?