Java EE a ServletRequest.getParameterValues () .
Sur les plates-formes non EE, URL.getQuery () renvoie simplement une chaîne.
Quelle est la façon normale d'analyser correctement la chaîne de requête dans une URL lorsqu'elle n'est pas sur Java EE?
<coup de gueule >
Il est populaire dans les réponses d'essayer de créer votre propre analyseur. C'est un projet de micro-codage très intéressant et passionnant, mais je ne peux pas dire que c'est une bonne idée :(
Les extraits de code ci-dessous sont généralement défectueux ou cassés, entre autres. Les briser est un exercice intéressant pour le lecteur. Et aux pirates qui attaquent les sites Web qui les utilisent .
L'analyse des chaînes de requête est un problème bien défini, mais la lecture de la spécification et la compréhension des nuances ne sont pas triviales. Il est préférable de laisser un codeur de bibliothèque de plate-forme faire le travail dur et faire la réparation pour vous!
< / rant >
getQuery()
et ce que vous souhaitez obtenir en sortie?ServletRequest
.Réponses:
Depuis Android M, les choses sont devenues plus compliquées. La réponse de android.net.URI .getQueryParameter () a un bug qui brise les espaces avant JellyBean. Apache URLEncodedUtils.parse () a fonctionné, mais a été abandonnée à L , et éliminé M .
La meilleure réponse est donc maintenant UrlQuerySanitizer . Cela existe depuis le niveau 1 de l'API et existe toujours. Cela vous fait également réfléchir aux problèmes délicats comme la façon de gérer les caractères spéciaux ou les valeurs répétées.
Le code le plus simple est
Si vous êtes satisfait du comportement d'analyse par défaut, vous pouvez faire:
mais vous devez vous assurer que vous comprenez quel est le comportement d'analyse par défaut, car ce n'est peut-être pas ce que vous voulez.
la source
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL);
String value = sanitizer.getValue("parameter");
UrlQuerySanitizer
dans sdk-23 n'a qu'une seule méthodesanitize()
_
. Je devais aller avec stackoverflow.com/a/35638979/1155282Sur Android:
la source
Sur Android, les bibliothèques Apache fournissent un analyseur de requêtes:
http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html et http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/ http / client / utils / URLEncodedUtils.html
la source
URLEncodedUtils.parse()
Retourne un ennuyeuxList
que vous devrez ensuite parcourir pour trouver la valeur d'une clé spécifique. Ce serait beaucoup plus agréable si cela retournait un peuMap
comme dans la réponse de BalusC.are
vraiment utiles, en fait. Le simple fait de voir quelques suggestions sur ce qui pourrait ne pas fonctionner avec le code est déjà d'une grande aide pour réfléchir par moi-même. Et attention, je ne voulais pas dire "rouler le vôtre c'est mieux", mais plutôt que c'est génial d'avoir du bon matériel pour une décision éclairée dans mon propre code.Voici la réponse de BalusC , mais elle compile et renvoie des résultats:
la source
String pair[] = param.split("=");
enString pair[] = param.split("=", 2);
pour diviser la paire clé = valeur uniquement lors de la première occurrence. Je crois qu'il est permis d'avoir des signes égaux non codés dans la valeur.Si vous avez des bibliothèques jetty (serveur ou client) sur votre chemin de classe, vous pouvez utiliser les classes util jetty (voir javadoc ), par exemple:
la source
Si vous utilisez Spring 3.1 ou une version ultérieure (oui, j'espérais que le support allait plus loin), vous pouvez utiliser les touches
UriComponents
etUriComponentsBuilder
:components.getQueryParams()
renvoie unMultiValueMap<String, String>
Voici un peu plus de documentation .
la source
Pour une servlet ou une page JSP, vous pouvez obtenir des paires clé / valeur de chaîne de requête en utilisant request.getParameter ("paramname")
Il existe d'autres façons de le faire, mais c'est ainsi que je le fais dans toutes les servlets et pages jsp que je crée.
la source
Sur Android, j'ai essayé d'utiliser la réponse @diyism mais j'ai rencontré le problème de caractère d'espace soulevé par @rpetrich, par exemple: je remplis un formulaire où
username = "us+us"
etpassword = "pw pw"
faisant ressembler une chaîne URL:Cependant, le code @diyism renvoie
"us+us"
et"pw+pw"
, c'est-à-dire qu'il ne détecte pas le caractère espace. Si l'URL a été réécrite avec%20
le caractère espace est identifié:Cela conduit au correctif suivant:
la source
replace(" ", "%20")
cela ne va pas. Mais a fait l'affaire pour moi: DL'analyse de la chaîne de requête est un peu plus compliquée qu'il n'y paraît, selon la façon dont vous pardonnez.
Tout d'abord, la chaîne de requête est en octets ascii. Vous lisez ces octets un par un et les convertissez en caractères. Si le personnage est? ou & puis il signale le début d'un nom de paramètre. Si le caractère est = alors il signale le début d'une valeur de paramètre. Si le caractère est%, il signale le début d'un octet codé. Voici où cela devient délicat.
Lorsque vous lisez dans un% char, vous devez lire les deux octets suivants et les interpréter comme des chiffres hexadécimaux. Cela signifie que les deux octets suivants seront 0-9, af ou AF. Collez ces deux chiffres hexadécimaux ensemble pour obtenir votre valeur d'octet. Mais rappelez-vous, les octets ne sont pas des caractères . Vous devez savoir quel encodage a été utilisé pour encoder les caractères. Le caractère é n'encode pas la même chose en UTF-8 qu'en ISO-8859-1. En général, il est impossible de savoir quel encodage a été utilisé pour un jeu de caractères donné. J'utilise toujours UTF-8 parce que mon site Web est configuré pour toujours servir tout en utilisant UTF-8 mais en pratique, vous ne pouvez pas en être certain. Certains user-agents vous indiqueront l'encodage des caractères dans la requête; vous pouvez essayer de lire cela si vous avez une demande HTTP complète. Si vous avez juste une URL isolée, bonne chance.
Quoi qu'il en soit, en supposant que vous utilisez UTF-8 ou un autre codage de caractères multi-octets, maintenant que vous avez décodé un octet codé, vous devez le mettre de côté jusqu'à ce que vous capturiez l'octet suivant. Vous avez besoin de tous les octets codés qui sont ensemble, car vous ne pouvez pas décoder correctement l'url un octet à la fois. Mettez de côté tous les octets qui sont ensemble puis décodez-les tous à la fois pour reconstruire votre personnage.
De plus, cela devient plus amusant si vous voulez être indulgent et tenir compte des agents utilisateurs qui gèrent les URL. Par exemple, certains clients de messagerie Web codent deux fois des éléments. Ou doublez les caractères? & = (Par exemple:)
http://yoursite.com/blah??p1==v1&&p2==v2
. Si vous voulez essayer de gérer cela avec élégance, vous devrez ajouter plus de logique à votre analyseur.la source
Sur Android, c'est aussi simple que le code ci-dessous:
De plus, si vous ne souhaitez pas enregistrer chaque utilisation de clé de requête attendue:
Avant d'appeler:
la source
J'ai des méthodes pour y parvenir:
1) :
2) et la façon la plus simple de le faire en utilisant la classe Uri :
et ceci est un exemple de la façon d'utiliser l'une des deux méthodes:
la valeur de tagValue est
800
la source
Sur Android, vous pouvez utiliser la méthode statique Uri.parse de la classe android.net.Uri pour faire le gros du travail. Si vous faites quoi que ce soit avec des URI et des intentions, vous voudrez de toute façon l'utiliser.
la source
Juste pour référence, c'est ce que j'ai fini avec (basé sur URLEncodedUtils et renvoyant une carte).
Fonctionnalités:
request.getQueryString()
)Map
List<String>
Code:
Un assistant de compatibilité (les valeurs sont stockées dans un tableau String comme dans ServletRequest.getParameterMap () ):
la source
Cela fonctionne pour moi .. Je ne sais pas pourquoi chacun recherchait une carte, une liste> Tout ce dont j'avais besoin était une simple carte de valeur de nom.
Pour garder les choses simples, j'ai utilisé la construction dans URI.getQuery ();
la source
Le Multimap de Goyave est mieux adapté à cela. Voici une version courte et épurée:
la source
Apache AXIS2 a une implémentation autonome de QueryStringParser.java. Si vous n'utilisez pas Axis2, téléchargez simplement le code source et le cas de test à partir d'ici -
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java
la source
Répondu d'origine ici
Sur Android, il y a la 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 les paires clé-valeur de requête.
La fonction suivante renvoie des paires clé-valeur sous la forme de HashMap.
En Java:
À Kotlin:
la source
Je ne pense pas qu'il y en ait un dans JRE. Vous pouvez trouver des fonctions similaires dans d'autres packages comme Apache HttpClient. Si vous n'utilisez aucun autre package, il vous suffit d'écrire le vôtre. Ce n'est pas si dur. Voici ce que j'utilise,
la source
Sur la base de la réponse de BalusC, j'ai écrit un exemple de code Java:
la source
la source
Utilisez Apache HttpComponents et connectez-le avec du code de collection pour accéder aux paramètres par valeur: http://www.joelgerard.com/2012/09/14/parsing-query-strings-in-java-and-accessing-values-by -clé/
la source
en utilisant la goyave:
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
cette méthode prend l'URI et renvoie la carte du nom et de la valeur nominale
la source
Vous dites "Java" mais "pas Java EE". Voulez-vous dire que vous utilisez JSP et / ou des servlets mais pas une pile Java EE complète? Si tel est le cas, vous devriez toujours avoir request.getParameter () à votre disposition.
Si vous voulez dire que vous écrivez Java mais que vous n'écrivez pas de JSP ni de servlets, ou que vous utilisez simplement Java comme point de référence mais que vous êtes sur une autre plate-forme qui n'a pas d'analyse de paramètres intégrée ... Wow , cela ressemble à une question improbable, mais si c'est le cas, le principe serait:
(Je pourrais écrire du code Java mais ce serait inutile, car si vous avez Java disponible, vous pouvez simplement utiliser request.getParameters.)
la source