Wie codiert man Abfrageparameter für eine URL in Java? Ich weiß, das scheint eine offensichtliche und bereits gestellte Frage zu sein.
Es gibt zwei Feinheiten, bei denen ich mir nicht sicher bin:
- Sollten Leerzeichen in der URL als "+" oder als "% 20" codiert werden? Wenn ich in Chrome "http://google.com/foo=?bar me" eingebe, ändert Chrome es so, dass es mit% 20 codiert wird
- Ist es notwendig / richtig, Doppelpunkte ":" als% 3B zu codieren? Chrome nicht.
Anmerkungen:
java.net.URLEncoder.encode
scheint nicht zu funktionieren, es scheint zu sein, dass Codierungsdaten vom Formular gesendet werden. Beispielsweise wird der Speicherplatz als+
anstelle von%20
und der Doppelpunkt codiert, der nicht erforderlich ist.java.net.URI
codiert keine Abfrageparameter
application/x-www-form-urlencoded
Schlüssel / Wert-Paare erwarten . Weitere Informationen findenAntworten:
java.net.URLEncoder.encode(String s, String encoding)
kann auch helfen. Es folgt der HTML-Formularcodierungapplication/x-www-form-urlencoded
.Auf der anderen Seite codiert die Prozentcodierung (auch als URL-Codierung bezeichnet ) Speicherplatz mit
%20
.:
Doppelpunkt ist ein reserviertes Zeichen, bleibt also nach der Codierung ein Doppelpunkt.quelle
URLEncoder
zu angepasst wirdapplication/x-www-form-urlencoded
MIME - Format (die eine gültige HTML - Formular - Codierung). Ich gehe davon aus, dass Sie nicht danach suchen.http://example.com/?url=http://example.com/?q=c&sort=name
. Sollte es codieren&sort=name
oder nicht? Es gibt keine Möglichkeit, den Wert von der URL zu unterscheiden. Das ist genau der Grund, warum Sie überhaupt eine Wertcodierung benötigen.BEARBEITEN:
URIUtil
ist in neueren Versionen nicht mehr verfügbar, bessere Antwort unter Java - Codierungs-URL oder von Herrn Sindi in diesem Thread.URIUtil
von Apache httpclient ist wirklich nützlich, obwohl es einige Alternativen gibtBeide sind im richtigen Kontext vollkommen gültig . Wenn Sie es wirklich vorziehen, können Sie eine Zeichenfolge ersetzen.
quelle
URIUtil.encodeWithinQuery
ist das, was Sie verwenden würden, um einen einzelnen Abfrageparameter zu codieren, was die ursprüngliche Frage zu sein schien.Leider erzeugt URLEncoder.encode () keine gültige Prozentcodierung (wie in RFC 3986 angegeben ).
URLEncoder.encode () codiert alles einwandfrei, außer dass das Leerzeichen mit "+" codiert ist. Alle Java-URI-Encoder, die ich finden konnte, legen nur öffentliche Methoden zum Codieren der Abfrage, des Fragments, der Pfadteile usw. offen - aber nicht die "rohe" Codierung. Dies ist unglücklich, da Fragment und Abfrage Speicherplatz in + codieren dürfen, sodass wir sie nicht verwenden möchten. Der Pfad wird ordnungsgemäß codiert, aber zuerst "normalisiert", sodass wir ihn auch nicht für die "generische" Codierung verwenden können.
Beste Lösung, die ich finden konnte:
Wenn
replaceAll()
es Ihnen zu langsam ist, besteht die Alternative wohl darin, Ihren eigenen Encoder zu rollen ...EDIT: Ich hatte diesen Code zuerst hier, der "?", "&", "=" Nicht richtig codiert:
quelle
+
ist eine vollkommen gültige Kodierung eines Raumes.+
kann es falsch interpretiert werden - werfen Sie einen Blick auf C # blogs.msdn.microsoft.com/yangxind/2006/11/08/…encodeURIComponent
Ausgabe von Javascript verglichen , und dies war die einzige exakte Übereinstimmung mit denen, die ich ausprobiert habe (Abfragen mit Leerzeichen, türkischen und deutschen Sonderzeichen).Es ist nicht erforderlich, einen Doppelpunkt in der Abfrage als% 3B zu codieren, obwohl dies nicht unzulässig ist.
Es scheint auch, dass nur prozentual codierte Leerzeichen gültig sind, da ich bezweifle, dass das Leerzeichen ein ALPHA oder ein DIGIT ist
Weitere Informationen finden Sie in der URI-Spezifikation .
quelle
application/x-www-form-urlencoded
Abfragezeichenfolge erstellen, ist beides in Ordnung. Wenn Sie eine URL reparieren, die der Benutzer eingegeben / eingefügt hat,:
sollten Sie diese in Ruhe lassen.Der eingebaute Java URLEncoder macht das, was er soll, und Sie sollten ihn verwenden.
Ein „+“ oder „% 20“ ist beide gültiger Ersatz für ein Leerzeichen in einer URL. Entweder wird man arbeiten.
Ein ":" sollte codiert werden, da es sich um ein Trennzeichen handelt. dh http: // foo oder ftp: // bar . Die Tatsache, dass ein bestimmter Browser damit umgehen kann, wenn er nicht codiert ist, macht es nicht korrekt. Sie sollten sie codieren.
Verwenden Sie als bewährte Methode unbedingt die Methode, die einen Zeichenkodierungsparameter verwendet. Dort wird in der Regel UTF-8 verwendet, das Sie jedoch explizit angeben sollten.
quelle
+
ist nur eine Darstellung des Raumes inapplication/x-www-form-urlencoded
; Es ist nicht garantiert, dass es funktioniert, auch wenn es auf HTTP beschränkt ist. Ebenso:
ist in einer Abfragezeichenfolge gültig und sollte nicht in konvertiert werden%3B
; Ein Server kann sie unterschiedlich interpretieren.http://
zuhttp%3A%2F%2F
dem ist nicht korrekthttp://
Teil nicht codieren . Die Methode ist für Abfrageparameter und codierte Formulardaten. Wenn Sie jedoch die URL einer anderen Website als Abfrageparameter übergeben möchten, möchten Sie sie dann codieren, um eine Verwechslung des URL-Parsers zu vermeiden.application/x-www-form-urlencoded
Inhaltstyp codiert . Bedeutet das nicht, dass es für HTTP funktionieren muss?Wenn Sie nur Platzprobleme in der URL haben. Ich habe unten Code verwendet und es funktioniert gut
Beispiel: URL ist
dann ist die Ausgabe von muUrl
quelle
Ich habe festgestellt, dass im Fall von Datetime (Timestamp)
URLEncoder.encode(param,"UTF-8")
nicht funktioniert.quelle