Подтвердить что ты не робот

HttpServletRequest - Получить параметры строки запроса, без данных формы

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

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

4b9b3361

Ответ 1

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

Лучшим способом, который я вижу, является прокси файл parameterMap и для каждого поиска параметров проверяет, содержит ли queryString "&? <parameterName> =".

Обратите внимание, что имя параметра должно быть закодировано URL до того, как эта проверка может быть выполнена, как указал Qerub.

Это экономит ваш синтаксический анализ и все еще дает вам только параметры URL.

Ответ 2

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

username=james&password=pwd

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

request.getParameter("username"); 

Ответ 3

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

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

GET/people? age = 42

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

PUT/people? age = 42

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

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

Ответ 4

Как утверждают другие ответы, нет способа получить параметры строки запроса с помощью сервлета 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;
}

Ответ 5

Java 8

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

Ответ 6

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

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

говорят:

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