webentwicklung-frage-antwort-db.com.de

Wie codiere ich URI-Parameterwerte?

Ich möchte einen URI als Wert eines Abfrage-/Matrixparameters senden. Bevor ich ihn an einen vorhandenen URI anhängen kann, muss er gemäß RFC 2396 codiert werden. Beispiel:

http://google.com/resource?key=value1 & value2

Ich erwarte die Ausgabe:

http%3a%2f%2fgoogle.com%2fresource%3fkey%3dvalue1%2520%26%2520value2

Weder Java.net.URLEncoder Noch Java.net.URI erzeugt die richtige Ausgabe. URLEncoder ist für die HTML-Formularkodierung vorgesehen, die nicht mit RFC 2396 identisch ist. URI verfügt über keinen Mechanismus zum Kodieren eines einzelnen Werts, sodass die Werte 1 und 2 nicht bekannt sind Teil des gleichen Schlüssels.

56
Gili

Jerseys riBuilder codiert URI-Komponenten nach Bedarf mit application/x-www-form-urlencoded und RFC 3986. Nach Angaben des Javadoc

Builder-Methoden führen eine kontextbezogene Codierung von Zeichen durch, die in der entsprechenden URI-Komponente nicht zulässig sind, und folgen dabei den Regeln des Datenträgertyps application/x-www-form-urlencoded für Abfrageparameter und RFC 3986 für alle anderen Komponenten. Es ist zu beachten, dass nur Zeichen, die in einer bestimmten Komponente nicht zulässig sind, einer Codierung unterliegen, so dass beispielsweise ein Pfad, der einer der Pfadmethoden zugeführt wird, Matrixparameter oder mehrere Pfadsegmente enthalten kann, da die Trennzeichen zulässige Zeichen sind und nicht codiert werden. Prozentcodierte Werte werden ebenfalls erkannt, sofern dies zulässig ist, und werden nicht doppelt codiert.

30

Sie können auch Spring's riUtils verwenden

19
Adam Gent

Ich habe nicht genug Reputation, um Antworten zu kommentieren, aber ich wollte nur darauf hinweisen, dass das Herunterladen der JSR-311-API alleine nicht funktionieren wird. Sie müssen die Referenzimplementierung herunterladen ( jersey ).

Nur wenn Sie die API von der JSR-Seite herunterladen, erhalten Sie eine ClassNotFoundException, wenn die API versucht, zur Laufzeit nach einer Implementierung zu suchen.

9
yincrash

Ich habe mein eigenes geschrieben, es ist kurz, supereinfach und Sie können es kopieren, wenn Sie möchten: http://www.dmurph.com/2011/01/Java-uri-encoder/

4
Daniel Murphy

Es scheint, dass CharEscapers von Google GData-Java-Client hat, was Sie wollen. Es verfügt über die uriPathEscaper-Methode, den uriQueryStringEscaper und den generischen uriEscaper. (Alle geben ein Escaper-Objekt zurück, das die tatsächliche Escape-Operation ausführt.) Apache-Lizenz.

2