HttpServletRequest – Abrufen von Abfragezeichenfolgenparametern, keine Formulardaten

Lesezeit: 4 Minuten

Benutzer-Avatar
Jason Stoltz

Im HttpServletRequest, getParameterMap gibt eine Zuordnung aller Abfragezeichenfolgenparameter und Postdatenparameter zurück.

Gibt es eine Möglichkeit, eine Karte NUR mit Parametern für Abfragezeichenfolgen zu erhalten? Ich versuche zu vermeiden, getQueryString zu verwenden und die Werte zu analysieren.

  • Sie können beides haben … Sie können Abfragezeichenfolgenparameter für eine POST-Anfrage haben. Und in diesem Fall werden sie alle von “getParameterMap” zurückgegeben.

    – JasonStoltz

    27. Juli 2011 um 15:51 Uhr


  • Oh, ok. Warum braucht man beides, nur neugierig?

    – Jacob

    27. Juli 2011 um 15:55 Uhr

  • Denn auf der resultierenden Seite möchte ich, dass eine Abfragezeichenfolge in der URL erscheint / in der Abfragezeichenfolge enthalten ist. Wir haben ein Tracking-System, das nach bestimmten Parametern in der Abfragezeichenfolge sucht.

    – JasonStoltz

    27. Juli 2011 um 16:24 Uhr

  • req.getParameterMap().containsKey(“Benutzername”);

    – Parag Jadhav

    12. Juli 2016 um 12:42 Uhr

Benutzer-Avatar
Küste

Sie können verwenden request.getQueryString()wenn die Abfragezeichenfolge wie ist

username=james&password=pwd

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

request.getParameter("username"); 

  • Dies dient zur Verwendung auf Java Server-Seiten.

    – Jorgesys

    25. Februar 2016 um 18:14 Uhr

  • Der zweite wird den Anforderungsstrom verderben, ich nehme an, die Frage ist, wie man den Benutzernamen erhält und den Eingabestrom für die spätere Verarbeitung behält

    – Pavel Niedoba

    12. Februar 2017 um 22:25 Uhr

  • @PavelNiedoba kannst du den Request-Stream erweitern, der zu einem verdorbenen Kommentar wird? Warum ist das so?

    – Scrollen

    5. August 2021 um 19:40 Uhr

Benutzer-Avatar
DoubleMalt

Im Gegensatz zu dem, was cularis sagte, kann es beides in der Parameterkarte geben.

Der beste Weg, den ich sehe, ist, die parameterMap zu proxieren und für jeden Parameterabruf zu prüfen, ob queryString “&?=” enthält.

Beachten Sie, dass parameterName URL-codiert werden muss, bevor diese Überprüfung durchgeführt werden kann, wie Qerub betonte.

Das erspart Ihnen das Parsing und liefert Ihnen trotzdem nur URL-Parameter.

  • Beachten Sie, dass parameterName muss URL-kodiert werden, bevor diese Prüfung durchgeführt werden kann.

    – qerub

    31. Mai 2013 um 13:01 Uhr

  • Die Abfragezeichenfolge enthält nie ?. Das ist das Trennzeichen zwischen URI und Abfragestring.

    – BalusC

    1. Juni 2013 um 14:14 Uhr

  • Hallo @DoubleMalt, ich habe die gleiche Anforderung, kann aber die von Ihnen bereitgestellte Lösung nicht erhalten. Können Sie Beispielcode bereitstellen?

    – Vishal Zanzrukia

    17. Dezember 2014 um 10:42 Uhr

  • @VishalZanzrukia: Was ist dein Code, der nicht funktioniert?

    – DoubleMalt

    18. Dezember 2014 um 11:22 Uhr

  • Ich mag die Idee, aber es gibt nicht immer ein “=”-Zeichen in der Abfragezeichenfolge. Wenn der Parameterwert leer ist, gibt es nur in der Abfragezeichenfolge. Ich persönlich denke, dass die Aufteilung durch “&” und “=” eine bessere Lösung wäre.

    – Bren

    10. August 2015 um 19:51 Uhr

Der Servlet-API fehlt diese Funktion, da sie zu einer Zeit erstellt wurde, als viele glaubten, dass die Abfragezeichenfolge und der Nachrichtentext nur zwei verschiedene Möglichkeiten zum Senden von Parametern seien, ohne zu erkennen, dass die Zwecke der Parameter grundlegend unterschiedlich sind.

Die Parameter der Abfragezeichenfolge ?foo=bar sind Teil der URL, da sie an der Identifizierung einer Ressource (die eine Sammlung vieler Ressourcen sein könnte) beteiligt sind, wie z. B. “alle Personen im Alter von 42”:

GET /personen?alter=42

Die Nachrichtentextparameter in POST oder PUT sind dazu da, eine Änderung an der/den Zielressource(n) auszudrücken. Fx setzt einen Wert auf das Attribut “hair”:

PUT /Personen?Alter=42

Haare = grau

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

Benutzer-Avatar
Bren

Wie in den anderen Antworten angegeben, gibt es keine Möglichkeit, Abfragezeichenfolgenparameter mithilfe der Servlet-API abzurufen.

Ich denke also, der beste Weg, um Abfrageparameter zu erhalten, besteht darin, die Abfragezeichenfolge selbst zu analysieren. (Es ist komplizierter, über Parameter zu iterieren und zu prü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, die auch CSV-getrennte Abfrageparameterwerte unterstützen.

Beispiel: username=james&username=smith&password=pwd1,pwd2 wird zurückkehren

password : [pwd1, pwd2] (Länge = 2)

username : [james, smith] (Länge = 2)

public static Map<String, String[]> getQueryParameters(HttpServletRequest request) throws UnsupportedEncodingException {
    Map<String, String[]> queryParameters = new HashMap<>();
    String queryString = request.getQueryString();
    if (StringUtils.isNotEmpty(queryString)) {
        queryString = URLDecoder.decode(queryString, StandardCharsets.UTF_8.toString());
        String[] parameters = queryString.split("&");
        for (String parameter : parameters) {
            String[] keyValuePair = parameter.split("=");
            String[] values = queryParameters.get(keyValuePair[0]);
            //length is one if no value is available.
            values = keyValuePair.length == 1 ? ArrayUtils.add(values, "") :
                    ArrayUtils.addAll(values, keyValuePair[1].split(",")); //handles CSV separated query param values.
            queryParameters.put(keyValuePair[0], values);
        }
    }
    return queryParameters;
}

Benutzer-Avatar
Giani Segato

Java 8

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

  • httpServletRequest.getParameterMap() genügt.

    – Uneingeschränkt

    10. August um 17:26 Uhr

Benutzer-Avatar
AlexR

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 die URL senden möchten, verwenden Sie eine REST-ähnliche Konvention, z. B. anstatt zu senden

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

sagen:

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

  • httpServletRequest.getParameterMap() genügt.

    – Uneingeschränkt

    10. August um 17:26 Uhr

1256540cookie-checkHttpServletRequest – Abrufen von Abfragezeichenfolgenparametern, keine Formulardaten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy