HttpServletRequest - получает параметры строки запроса, без данных формы - PullRequest
63 голосов
/ 27 июля 2011

В HttpServletRequest , getParameterMap возвращает карту всех параметров строки запроса и параметров данных.

Есть ли способ получить карту только параметров строки запроса?Я пытаюсь избежать использования getQueryString и разбора значений.

Ответы [ 6 ]

65 голосов
/ 12 февраля 2014

Вы можете использовать request.getQueryString(), если строка запроса похожа на

username=james&password=pwd

Чтобы получить имя, вы можете сделать это

request.getParameter("username"); 
20 голосов
/ 27 июля 2011

Вопреки тому, что сказал Cularis, это может быть как в карте параметров.

Лучший способ, который я вижу, - это прокси-сервер для параметра и проверка каждого параметра для получения, если queryString содержит "&? =".

Обратите внимание, что для этой проверки необходимо указать в параметре имя_параметра URL, как указал Керуб.

Это экономит вам парсинг и по-прежнему дает только параметры URL.

18 голосов
/ 08 сентября 2012

API сервлета не имеет этой возможности, потому что он был создан в то время, когда многие полагали, что строка запроса и тело сообщения - это просто два разных способа отправки параметров, не понимая, что назначение параметров принципиально отличается.

Параметры строки запроса? Foo = bar являются частью URL, потому что они участвуют в идентификации ресурса (который может быть набором многих ресурсов), например, «все люди в возрасте 42 лет»:

GET / чел? Возраст = 42

Параметры тела сообщения в POST или PUT предназначены для выражения модификации целевого (ых) ресурса (ов). Fx устанавливает значение для атрибута "hair":

ПУТ / чел? Возраст = 42

волосы = серый

Так что, безусловно, RESTful использовать параметры запроса и параметры тела одновременно, разделенные, чтобы вы могли использовать их для разных целей. Эта функция определенно отсутствует в API сервлетов Java.

11 голосов
/ 10 августа 2015

Поскольку другие ответы указывают, что невозможно получить параметры строки запроса с помощью сервлетов API.

Итак, я думаю, что лучший способ получить параметры запроса - это синтаксический анализ строки запроса самостоятельно. (Сложнее перебирать параметры и проверять, содержит ли строка запроса параметр)

Я написал код ниже, чтобы получить параметры строки запроса. Использование apache StringUtils и 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;
}
4 голосов
/ 19 сентября 2018

Java 8

return Collections.list(httpServletRequest.getParameterNames())
                  .stream()
                  .collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
2 голосов
/ 27 июля 2011

Боюсь, что невозможно получить параметры строки запроса отдельно от параметров записи. Кстати, тот факт, что такой API отсутствует, может означать, что, вероятно, вам следует проверить свой дизайн. Почему вы используете строку запроса при отправке POST? Если вы действительно хотите отправить больше данных в URL, используйте REST-подобное соглашение, например, вместо отправки

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

говорят:

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

...