J'ai l'URI comme ceci:
https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback
J'ai besoin d'une collection avec des éléments analysés:
NAME VALUE
------------------------
client_id SS
response_type code
scope N_FULL
access_type offline
redirect_uri http://localhost/Callback
Pour être exact, j'ai besoin d'un équivalent Java pour la méthode C # /. NET HttpUtility.ParseQueryString .
S'il vous plaît, donnez-moi un conseil à ce sujet.
Merci.
java
parsing
uri
namevaluecollection
Sergey Shafiev
la source
la source
java.net.URI
/java.net.URL
?Réponses:
Si vous cherchez un moyen d'y parvenir sans utiliser de bibliothèque externe, le code suivant vous aidera.
Vous pouvez accéder à la carte retournée en utilisant
<map>.get("client_id")
, avec l'URL indiquée dans votre question, cela retournerait "SS".UPDATE URL-Decoding ajouté
MISE À JOUR Comme cette réponse est encore assez populaire, j'ai fait une version améliorée de la méthode ci-dessus, qui gère plusieurs paramètres avec la même clé et des paramètres sans valeur également.
METTRE À JOUR la version Java8
Exécution de la méthode ci-dessus avec l'URL
https://stackoverflow.com?param1=value1¶m2=¶m3=value3¶m3
renvoie cette carte:
la source
org.apache.http.client.utils.URLEncodedUtils
est une bibliothèque bien connue qui peut le faire pour vous
Les sorties
la source
List<NameValuePair>
enMap<String,String>
Java qui n'a pas accès aux crochets pour les cartes de hachage, cela ressemblerait àmap.get("one")
Si vous ne savez pas comment faire, ce devrait être une autre question (mais essayez d'abord par vous-même) . Nous préférons garder les questions minces ici à SOSystem.out.println(URLEncodedUtils.parse(new URI("http://example.com/?foo=bar&foo=baz"), "UTF-8"));
affichera [foo = bar, foo = baz] .URLEncodedUtils and
NameValuePair` n'est plus disponible (sauf si vous ajoutez une dépendance à la bibliothèque Apache héritée comme décrit ici ).Si vous utilisez Spring Framework:
Tu auras:
la source
UriComponentsBuilder.fromHttpUrl(url)
utilisez google Guava et faites-le en 2 lignes:
ce qui vous donne
la source
uri
vous devez utilisernew java.net.URL(uri).getQuery()
car cela vous achète une validation d'entrée gratuite sur l'URL.splitter.split()
jetteraIllegalArgumentException
s'il y a une clé en double dans la chaîne de requête. Voir stackoverflow.com/questions/1746507/…Le moyen le plus court que j'ai trouvé est celui-ci:
MISE À JOUR:
UriComponentsBuilder
vient du printemps. Voici le lien .la source
Pour Android, si vous utilisez OkHttp dans votre projet. Vous pourriez y jeter un œil. C'est simple et utile.
la source
Java 8 one statement
Étant donné l'URL à analyser:
Cette solution collecte une liste de paires:
Cette solution recueille en revanche une carte (étant donné que dans une url il peut y avoir plus de paramètres avec le même nom mais des valeurs différentes).
Les deux solutions doivent utiliser une fonction utilitaire pour décoder correctement les paramètres.
la source
Si vous utilisez le servlet, essayez ceci
la source
HttpServletRequest
et cela fonctionneMockHttpServletRequest
aussi bien dans les tests unitaires Mock MVC.Si vous utilisez Java 8 et que vous souhaitez écrire quelques méthodes réutilisables, vous pouvez le faire sur une seule ligne.
Mais c'est une ligne assez brutale.
la source
Sur Android, il existe une classe Uri dans le package android.net . Notez que Uri fait partie de android.net , tandis que URI fait partie de java.net .
La classe Uri a de nombreuses fonctions pour extraire des paires clé-valeur d'une requête.
La fonction suivante renvoie des paires clé-valeur sous la forme de HashMap.
En Java:
À Kotlin:
la source
En utilisant les commentaires et solutions mentionnés ci-dessus, je stocke tous les paramètres de requête en utilisant Map <String, Object> où les objets peuvent être soit string soit Set <String>. La solution est donnée ci-dessous. Il est recommandé d'utiliser une sorte de validateur d'URL pour valider d'abord l'URL, puis d'appeler la méthode convertQueryStringToMap.
la source
J'ai essayé une version Kotlin pour voir comment c'est le meilleur résultat sur Google.
Et les méthodes d'extension
la source
Une solution prête à l'emploi pour le décodage de la partie de requête URI (y compris le décodage et les valeurs multi-paramètres)
commentaires
Je n'étais pas satisfait du code fourni par @ Pr0gr4mm3r dans https://stackoverflow.com/a/13592567/1211082 . La solution basée sur Stream ne fait pas URLDecoding, la version mutable clumpy.
J'ai donc élaboré une solution qui
Map<String, List<Optional<String>>>
Optional.empty()
au lieu denull
)URLdecode
UnsupportedEncodingException
en une exception d'exécutionRuntimeUnsupportedEncodingException
qui permet l'interaction avec le flux. (L'encapsulation de fonctions régulières dans des fonctions lançant des exceptions vérifiées est un problème. Et ScalaTry
n'est pas disponible dans le langage Java par défaut.)Code Java
Code Scala
... et par souci d'exhaustivité, je ne peux pas résister à fournir la solution en Scala qui domine par la brièveté et la beauté
la source
Juste une mise à jour de la version Java 8
les méthodes de mappage et toList () doivent être utilisées avec les collecteurs, ce qui n'était pas mentionné dans la première réponse. Sinon, cela générerait une erreur de compilation dans l'IDE
la source
splitQueryParameters()
méthode? Et qu'est-ce que c'est**Collectors**
?Réponse de Kotlin avec référence initiale de https://stackoverflow.com/a/51024552/3286489 , mais avec une version améliorée en rangeant les codes et en fournissant 2 versions, et en utilisant des opérations de collecte immuables
Utilisez
java.net.URI
pour extraire la requête. Utilisez ensuite les fonctions d'extension fournies ci-dessouspage2&page3
-à- dire qu'elle obtienne{page=3}
, utilisez la fonction d'extension ci-dessouspage2&page3
-à- dire{page=[2, 3]}
La façon de l'utiliser comme ci-dessous
la source
Netty fournit également un joli analyseur de chaîne de requête appelé
QueryStringDecoder
. Sur une ligne de code, il peut analyser l'URL dans la question. J'aime parce qu'il ne nécessite pas d'attraper ou de lancerjava.net.MalformedURLException
.En une seule ligne:
Voir javadocs ici: https://netty.io/4.1/api/io/netty/handler/codec/http/QueryStringDecoder.html
Voici un court exemple, autonome et correct:
qui génère
la source
Répondre ici parce que c'est un fil populaire. Il s'agit d'une solution propre dans Kotlin qui utilise l'
UrlQuerySanitizer
API recommandée . Voir la documentation officielle . J'ai ajouté un générateur de chaînes pour concaténer et afficher les paramètres.la source
Voici ma solution avec réduire et facultatif :
Optional<SimpleImmutableEntry<String, String>>
pour ignorer les ordures plus tardDans le cas où vous demandez, la réduction nécessite ce combineur étrange dans le dernier paramètre, qui n'est utilisé que dans les flux parallèles. Son objectif est de fusionner deux résultats intermédiaires (ici HashMap).
la source
Si vous utilisez Spring, ajoutez un argument de type
@RequestParam Map<String,String>
à votre méthode de contrôleur, et Spring construira la carte pour vous!la source