Ich habe die URI wie folgt:
https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback
Ich brauche eine Sammlung mit analysierten Elementen:
NAME VALUE
------------------------
client_id SS
response_type code
scope N_FULL
access_type offline
redirect_uri http://localhost/Callback
Um genau zu sein, benötige ich ein Java-Äquivalent für die C # /. NET HttpUtility.ParseQueryString- Methode.
Bitte geben Sie mir einen Rat dazu.
Vielen Dank.
java
parsing
uri
namevaluecollection
Sergey Shafiev
quelle
quelle
java.net.URI
/ istjava.net.URL
?Antworten:
Wenn Sie nach einer Möglichkeit suchen, dies ohne Verwendung einer externen Bibliothek zu erreichen, hilft Ihnen der folgende Code.
Sie können auf die zurückgegebene Karte zugreifen, indem Sie
<map>.get("client_id")
mit der in Ihrer Frage angegebenen URL "SS" zurückgeben.UPDATE URL-Decodierung hinzugefügt
UPDATE Da diese Antwort immer noch sehr beliebt ist, habe ich eine verbesserte Version der obigen Methode erstellt, die mehrere Parameter mit demselben Schlüssel und Parameter ohne Wert behandelt.
UPDATE Java8-Version
Ausführen der obigen Methode mit der URL
https://stackoverflow.com?param1=value1¶m2=¶m3=value3¶m3
gibt diese Karte zurück:
quelle
org.apache.http.client.utils.URLEncodedUtils
ist eine bekannte Bibliothek, die dies für Sie tun kann
Ausgänge
quelle
List<NameValuePair>
in einMap<String,String>
Java zu konvertieren, das keinen Klammerzugriff für Hash-Maps hat. Es sieht so aus, als obmap.get("one")
wenn Sie nicht wissen, wie das geht, es eine andere Frage sein sollte (aber versuchen Sie es zuerst selbst). . Wir ziehen es vor, die Fragen hier bei SOSystem.out.println(URLEncodedUtils.parse(new URI("http://example.com/?foo=bar&foo=baz"), "UTF-8"));
druckt [foo = bar, foo = baz] .URLEncodedUtils and
NameValuePair` nicht mehr verfügbar sind (es sei denn, Sie fügen der alten Apache-Bibliothek eine Abhängigkeit hinzu, wie hier beschrieben ).Wenn Sie Spring Framework verwenden:
Sie erhalten:
quelle
UriComponentsBuilder.fromHttpUrl(url)
Verwenden Sie Google Guava und machen Sie es in 2 Zeilen:
was gibt dir
quelle
uri
, sollten Sie verwenden,new java.net.URL(uri).getQuery()
da dies Ihnen eine kostenlose Eingabevalidierung für die URL ermöglicht.splitter.split()
wird,IllegalArgumentException
wenn die Abfragezeichenfolge einen doppelten Schlüssel enthält. Siehe stackoverflow.com/questions/1746507/…Der kürzeste Weg, den ich gefunden habe, ist dieser:
UPDATE:
UriComponentsBuilder
kommt aus dem Frühling. Hier der Link .quelle
Für Android, wenn Sie OkHttp in Ihrem Projekt verwenden. Sie könnten einen Blick darauf werfen. Es ist einfach und hilfreich.
quelle
Java 8 eine Anweisung
Angesichts der zu analysierenden URL:
Diese Lösung sammelt eine Liste von Paaren:
Diese Lösung sammelt andererseits eine Karte (vorausgesetzt, dass in einer URL mehr Parameter mit demselben Namen, aber unterschiedlichen Werten vorhanden sein können).
Beide Lösungen müssen eine Utility-Funktion verwenden, um die Parameter ordnungsgemäß zu dekodieren.
quelle
Wenn Sie das Servlet doGet verwenden, versuchen Sie dies
quelle
HttpServletRequest
und es funktioniert auch mitMockHttpServletRequest
Mock MVC-Komponententests.Wenn Sie Java 8 verwenden und bereit sind, einige wiederverwendbare Methoden zu schreiben, können Sie dies in einer Zeile tun.
Aber das ist eine ziemlich brutale Linie.
quelle
Unter Android gibt es eine Uri-Klasse im Paket android.net . Beachten Sie, dass Uri Teil von android.net ist , während URI Teil von java.net ist .
Die Uri-Klasse verfügt über viele Funktionen zum Extrahieren von Schlüssel-Wert-Paaren aus einer Abfrage.
Die folgende Funktion gibt Schlüssel-Wert-Paare in Form von HashMap zurück.
In Java:
In Kotlin:
quelle
Mit den oben genannten Kommentaren und Lösungen speichere ich alle Abfrageparameter mithilfe von Map <String, Object>, wobei Objekte entweder String oder Set <String> sein können. Die Lösung ist unten angegeben. Es wird empfohlen, zuerst eine Art URL-Validator zu verwenden, um die URL zu validieren, und dann die Methode convertQueryStringToMap aufzurufen.
quelle
Ich habe eine Kotlin-Version ausprobiert und gesehen, wie dies das beste Ergebnis in Google ist.
Und die Erweiterungsmethoden
quelle
Eine gebrauchsfertige Lösung zur Dekodierung des URI-Abfrageteils (inkl. Dekodierung und Multi-Parameter-Werte)
Bemerkungen
Ich war mit dem Code von @ Pr0gr4mm3r in https://stackoverflow.com/a/13592567/1211082 nicht zufrieden . Die Stream-basierte Lösung führt keine URLDecoding durch, die veränderbare Version ist klumpig.
So habe ich eine Lösung ausgearbeitet, die
Map<String, List<Optional<String>>>
Optional.empty()
anstelle vonnull
)URLdecode
UnsupportedEncodingException
in eine LaufzeitausnahmeRuntimeUnsupportedEncodingException
, die das Zusammenspiel mit dem Stream ermöglicht. (Das Einschließen der regulären Funktion in Funktionen, die aktivierte Ausnahmen auslösen, ist schmerzhaft. Und ScalaTry
ist in der Java-Standardeinstellung nicht verfügbar.)Java Code
Scala Code
... und der Vollständigkeit halber kann ich nicht widerstehen, die Lösung in Scala anzubieten, die von Kürze und Schönheit dominiert
quelle
Nur ein Update auf die Java 8 Version
Mapping- und toList () -Methoden müssen mit Collectors verwendet werden, was in der oberen Antwort nicht erwähnt wurde. Andernfalls würde ein Kompilierungsfehler in der IDE ausgelöst
quelle
splitQueryParameters()
Methode teilen ? Und was ist mit dem**Collectors**
?Kotlins Antwort mit dem ersten Verweis von https://stackoverflow.com/a/51024552/3286489 , jedoch mit verbesserter Version durch Aufräumen von Codes und Bereitstellung von 2 Versionen davon und Verwendung unveränderlicher Erfassungsvorgänge
Verwenden Sie
java.net.URI
diese Option, um die Abfrage zu extrahieren. Verwenden Sie dann die unten angegebenen Erweiterungsfunktionenpage2&page3
erhalten{page=3}
, verwenden Sie die folgende Erweiterungsfunktionpage2&page3
erhalten{page=[2, 3]}
Die Verwendung wie unten
quelle
Netty bietet auch einen netten Parser für Abfragezeichenfolgen mit dem Namen
QueryStringDecoder
. In einer Codezeile kann die URL in der Frage analysiert werden. Ich mag, weil es nicht das Fangen oder Werfen erfordertjava.net.MalformedURLException
.In einer Zeile:
Siehe javadocs hier: https://netty.io/4.1/api/io/netty/handler/codec/http/QueryStringDecoder.html
Hier ist ein kurzes, in sich geschlossenes, korrektes Beispiel:
was erzeugt
quelle
Hier antworten, weil dies ein beliebter Thread ist. Dies ist eine saubere Lösung in Kotlin, die die empfohlene
UrlQuerySanitizer
API verwendet. Siehe die offizielle Dokumentation . Ich habe einen String Builder hinzugefügt, um die Parameter zu verketten und anzuzeigen.quelle
Hier ist meine Lösung mit Reduzieren und Optional :
Optional<SimpleImmutableEntry<String, String>>
ignoriere Müll späterWenn Sie fragen, erfordert Reduzieren diesen seltsamen Kombinierer im letzten Parameter, der nur in parallelen Streams verwendet wird. Ziel ist es, zwei Zwischenergebnisse zusammenzuführen (hier HashMap).
quelle
Wenn Sie Spring verwenden, fügen Sie
@RequestParam Map<String,String>
Ihrer Controller-Methode ein Argument vom Typ hinzu , und Spring erstellt die Map für Sie!quelle