web-dev-qa-db-fra.com

HttpServletRequest - Récupère les paramètres d'une chaîne de requête, pas de données de formulaire

Dans HttpServletRequest , getParameterMap renvoie une mappe de tous les paramètres de chaîne de requête et de paramètres de données de publication.

Existe-t-il un moyen d'obtenir une mappe de paramètres de chaîne de requête UNIQUEMENT? J'essaie d'éviter d'utiliser getQueryString et d'analyser les valeurs.

65
JasonStoltz

Contrairement à ce que dit cularis, il peut y avoir les deux dans la carte des paramètres.

Le meilleur moyen que je vois est d’utiliser un proxy pour ParameterMap et, pour chaque récupération de paramètre, vérifiez si queryString contient "&? <ParamètreName> =".

Notez que nomParamètre doit être encodé en URL avant de pouvoir effectuer cette vérification, comme l'a souligné Qerub.

Cela vous évite l'analyse et ne vous donne toujours que des paramètres d'URL.

20
DoubleMalt

Vous pouvez utiliser request.getQueryString(), si la chaîne de requête est semblable à

username=james&password=pwd

Pour obtenir le nom, vous pouvez le faire

request.getParameter("username"); 
70
coastline

Cette fonctionnalité n'a pas cette fonctionnalité dans l'API servlet car elle a été créée à une époque où beaucoup pensaient que la chaîne de requête et le corps du message n'étaient que deux manières différentes d'envoyer des paramètres, sans se rendre compte que les objectifs de ces paramètres sont fondamentalement différents.

Les paramètres de chaîne de requête? Foo = bar font partie de l'URL car ils sont impliqués dans l'identification d'une ressource (qui pourrait être une collection de nombreuses ressources), comme "toutes les personnes âgées de 42 ans":

GET/personnes? Âge = 42

Les paramètres du corps du message dans POST ou PUT permettent d’exprimer une modification de la ou des ressources cibles. Fx définissant une valeur pour l’attribut "hair":

PUT/personnes? Âge = 42

cheveux = gris

Il est donc certainement RESTful d’utiliser les paramètres de requête et les paramètres de corps en même temps, séparés de manière à pouvoir les utiliser à des fins différentes. La fonctionnalité est définitivement absente de l'API servlet Java.

18
Ola Berg

Comme les autres réponses indiquent qu'il est impossible d'obtenir des paramètres de chaîne de requête à l'aide d'une API de servlet.

Donc, je pense que le meilleur moyen d’obtenir des paramètres de requête est d’analyser vous-même la chaîne de requête. (Il est plus compliqué de parcourir les paramètres et de vérifier si la chaîne de requête contient le paramètre)

J'ai écrit ci-dessous le code pour obtenir les paramètres de chaîne de requête. Utilisation de Apache StringUtils et ArrayUtils.

public static Map<String, String[]> getQueryParameters(HttpServletRequest request) {
    Map<String, String[]> queryParameters = new HashMap<>();
    String queryString = request.getQueryString();

    if (StringUtils.isEmpty(queryString)) {
        return queryParameters;
    }

    String[] parameters = queryString.split("&");

    for (String parameter : parameters) {
        String[] keyValuePair = parameter.split("=");
        String[] values = queryParameters.get(keyValuePair[0]);
        values = ArrayUtils.add(values, keyValuePair.length == 1 ? "" : keyValuePair[1]); //length is one if no value is available.
        queryParameters.put(keyValuePair[0], values);
    }
    return queryParameters;
}
11
Bren

Java 8

return Collections.list(httpServletRequest.getParameterNames())
                  .stream()
                  .collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
4
Giani Segatto

Je crains qu'il n'y ait aucun moyen d'obtenir les paramètres de chaîne de requête analysés séparément des paramètres de publication. BTW le fait que cette API absente peut signifier que vous devriez probablement vérifier votre conception. Pourquoi utilisez-vous une chaîne de requête lors de l'envoi de POST? Si vous voulez vraiment envoyer plus de données dans une URL, utilisez la convention de type REST, par exemple. au lieu d'envoyer

http://mycompany.com/myapp/myservlet?first=11&second=22

dire:

http://mycompany.com/myapp/myservlet/11/22

2
AlexR