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é.

53
demandé sur Gili 2009-01-14 21:21:23

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.

30
répondu Gili 2011-11-07 16:26:01

vous pouvez également utiliser le UriUtils

17
répondu Adam Gent 2011-07-16 03:48:28

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.

9
répondu yincrash 2018-04-12 03:08:22

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/

4
répondu Daniel Murphy 2011-03-31 02:48:09

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.

2
répondu Peter Štibraný 2009-01-14 19:30:01

je pense que le classe URI est celui que vous recherchez.

-2
répondu Glenn 2009-01-14 18:33:09

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?

-3
répondu OscarRyz 2009-01-14 19:44:19