webentwicklung-frage-antwort-db.com.de

HttpServletRequest - Abrufen von Abfragezeichenfolgenparametern, keine Formulardaten

In HttpServletRequest gibt getParameterMap eine Zuordnung aller Abfragezeichenfolgenparameter und Post-Datenparameter zurück.

Gibt es eine Möglichkeit, eine Map mit NUR Abfragezeichenfolgenparametern abzurufen? Ich versuche, die Verwendung von getQueryString und das Parsen der Werte zu vermeiden.

65
JasonStoltz

Im Gegensatz zu Cularis kann es in der Parameterkarte beides geben.

Der beste Weg, den ich sehe, besteht darin, die parameterMap zu proxyen und bei jedem Parameterabruf zu überprüfen, ob queryString "&? <ParameterName> =" enthält.

Beachten Sie, dass parameterName URL-codiert sein muss, bevor diese Prüfung durchgeführt werden kann, wie Qerub hervorhob.

Das erspart Ihnen das Parsen und gibt Ihnen nur URL-Parameter.

20
DoubleMalt

Sie können request.getQueryString() verwenden, wenn die Abfragezeichenfolge wie folgt lautet

username=james&password=pwd

Um einen Namen zu erhalten, können Sie dies tun

request.getParameter("username"); 
70
coastline

Der Servlet-API fehlt diese Funktion, da sie in einer Zeit erstellt wurde, in der viele der Ansicht waren, dass die Abfragezeichenfolge und der Nachrichtentext nur zwei verschiedene Methoden zum Senden von Parametern waren, ohne zu erkennen, dass die Zwecke der Parameter grundlegend unterschiedlich sind.

Die Abfragezeichenfolgenparameter? Foo = bar sind Teil der URL, da sie bei der Identifizierung einer Ressource (die eine Sammlung vieler Ressourcen sein kann) beteiligt sind, z. B. "alle Personen im Alter von 42":

GET/Personen? Alter = 42

Die Parameter für den Nachrichtentext in POST oder PUT drücken eine Änderung der Zielressource (n) aus. Fx setzt einen Wert auf das Attribut "hair":

PUT/Personen? Alter = 42

haare = grau

Es ist also auf jeden Fall RESTful, sowohl Abfrageparameter als auch Body-Parameter gleichzeitig getrennt zu verwenden, damit Sie sie für verschiedene Zwecke verwenden können. Die Funktion fehlt definitiv in der Java Servlet-API.

18
Ola Berg

Wie in den anderen Antworten angegeben, können Abfragezeichenfolgenparameter nicht mit der Servlet-API abgerufen werden.

Daher denke ich, dass der beste Weg, um Abfrageparameter zu erhalten, darin besteht, die Abfragezeichenfolge selbst zu analysieren. (Es ist komplizierter, die Parameter zu durchlaufen und zu überprüfen, ob die Abfragezeichenfolge den Parameter enthält.)

Ich habe den folgenden Code geschrieben, um Parameter für Abfragezeichenfolgen zu erhalten. Verwenden von Apache StringUtils und 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

Ich fürchte, es gibt keine Möglichkeit, die Parameter der Abfragezeichenfolge getrennt von den Post-Parametern zu analysieren. Übrigens kann die Tatsache, dass eine solche API fehlt, bedeuten, dass Sie wahrscheinlich Ihr Design überprüfen sollten. Warum verwenden Sie beim Senden von POST eine Abfragezeichenfolge? Wenn Sie wirklich mehr Daten an eine URL senden möchten, verwenden Sie eine REST-ähnliche Konvention, z. anstatt zu senden

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

sagen:

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

2
AlexR