Tun Doppelpunkte erfordern Codierung in URI-query-Parameter?
Habe ich bemerkt, dass Java - UriBuilder
ist nicht die Codierung der :
Zeichen eingeschlossen in meinem query-parameter-Werte (ISO-8601 formatierte strings).
Laut Wikipedia scheint es, Doppelpunkt codiert werden sollten.
Insbesondere die Codierung des Abfrage Strings verwendet die folgenden Regeln:
- Buchstaben (A-Z und a-Z), zahlen (0-9) und die Zeichen '.','-','~' und '_' sind als Links-ist
- RAUM codiert ist als " + "oder" %20[citation needed]
- Alle anderen Zeichen kodiert als %FF hex Darstellung mit nicht-ASCII-Zeichen zunächst als UTF-8 kodiert (oder andere angegebene
Codierung)
Also, was ist der deal? Sollten Doppelpunkte in den query-Parameter kodiert werden oder nicht?
Update:
Ich schaute auf die URI-Syntax-Spezifikation (RFC 3986) und es sieht aus wie Codierung Semikolon im query params ist wirklich nicht notwendig. Hier ein Auszug aus der ABNF für URI:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query = *( pchar /"/" /"?" )
pchar = unreserved /pct-encoded /sub-delims /":" /"@"
unreserved = ALPHA /DIGIT /"-" /"." /"_" /"~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" /"$" /"&" /"'" /"(" /")" /"*" /"+" /"," /";" /"=
- Korrigieren Sie mich, wenn ich falsch bin, aber in deinem link ":" vorbehalten, die ein gen-delim und "jede [gen-delims] sind auch in der reservierten gesetzt sind 'reserviert' für die Verwendung als Unterkomponenten-Trennzeichen innerhalb der Komponente" (dh sub-delims)
- Ich bin nur die Interpretation der ABNF, die es erlaubt ':' als Teil des query-strings. Dies passt auch mit dem Verhalten von Java ist UriBuilder sowie einige code, den ich getestet .NET. Dennoch ist es verwirrend, da Sie darauf hinweisen, die der text suggeriert, dass es sollte anders aufführen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie codiert werden sollten, die in einem query-string. Die korrekte Kodierung ist
%3A
Allerdings kann ich verstehen, warum UriBuilder nicht die Kodierung
:
. Sie wollen nicht zu codieren, die einen Doppelpunkt nach dem Protokoll (z.B.http:
) oder zwischen dem Benutzernamen und Passwort (z.B.ftp://username:[email protected]
) in eine absolute URI.Gibt es keine
UriBuilder
im Java-SDK, es ist definiert durch JAX-RS. Es ist Dokumentation Staaten query Parameter müssen URL-codiert sein, andere Komponenten codiert sind, unter Verwendung von RFC 3986.Jedoch die Jersey-Implementierung der JAX-RS spielt nicht von dieser Skillung, und alles codiert gemäß RFC 3986. Es ist ein Fehler, siehe die JIRA ticket.
UriBuilder.queryParam(name, value)
zu haben scheint unterschiedliche encoding-Regeln alsUriBuilder.replaceQuery(query)
. Erstere kodiert für die':'
Charakter, während die letzteren nicht, zumindest in RESTEasy 3.0.7.Endgültig. Ist das beabsichtigte Verhalten, und haben Sie eine Erklärung dafür, warum es existiert der Unterschied?