У HttpServletRequest , getParameterMap
повертає карту всіх параметрів рядка запиту і пост параметрів даних.
Чи є спосіб отримати карту ТІЛЬКИ параметрів рядка запиту? Я намагаюся уникати використання getQueryString та аналізу значень.
У HttpServletRequest , getParameterMap
повертає карту всіх параметрів рядка запиту і пост параметрів даних.
Чи є спосіб отримати карту ТІЛЬКИ параметрів рядка запиту? Я намагаюся уникати використання getQueryString та аналізу значень.
Відповіді:
На відміну від сказаного cularis, у карті параметрів може бути як те, так і інше.
Найкращий спосіб, який я бачу, - це встановити проксі-параметр і для кожного пошуку параметрів перевірити, чи містить queryString "&? <parameterName> =".
Зауважте, що для того, щоб здійснити цю перевірку, як слід зазначити Qerub, параметрName потрібно закодувати URL-адресою.
Це заощаджує аналіз і надає лише параметри URL-адреси.
parameterName
перед виконанням цієї перевірки потрібно закодувати URL-адресу.
?
. Це символ розділювача між URI та рядком запиту.
Ви можете використовувати request.getQueryString()
, якщо рядок запиту подібний
username=james&password=pwd
Щоб отримати ім’я, ви можете це зробити
request.getParameter("username");
API сервлета не має цієї функції, оскільки він був створений у той час, коли багато хто вважав, що рядок запиту та тіло повідомлення - це лише два різні способи надсилання параметрів, не розуміючи, що цілі параметрів принципово різні.
Параметри рядка запиту? Foo = bar є частиною URL-адреси, оскільки вони беруть участь у ідентифікації ресурсу (який може бути сукупністю багатьох ресурсів), наприклад "усі особи у віці 42 років":
GET / осіб? Вік = 42
Параметри тіла повідомлення в POST або PUT існують для вираження модифікації цільових ресурсів. Fx встановлює значення атрибуту "волосся":
Покласти / осіб? Вік = 42
волосся = сиве
Отож, безумовно, НАДІЙНО використовувати одночасно параметри запиту та параметри тіла, розділені таким чином, що ви можете використовувати їх для різних цілей. Ця функція точно відсутня в API сервлету Java.
Оскільки інші відповіді стверджують, немає можливості отримати параметри рядка запиту за допомогою API сервлету.
Отже, я думаю, що найкращим способом отримати параметри запиту є синтаксичний аналіз рядка запиту. (Це більш складна ітерація параметрів і перевірка, чи рядок запиту містить параметр)
Я написав нижче код, щоб отримати параметри рядка запиту. Використання apache StringUtils та ArrayUtils, які також підтримують значення параметрів запиту, розділених CSV.
Приклад: username=james&username=smith&password=pwd1,pwd2
повернеться
password : [pwd1, pwd2]
(довжина = 2)
username : [james, smith]
(довжина = 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;
}
&
символ у своєму значенні, чи дасть він вам правильний результат
URLDecoder.decode(keyValuePair[0])
(або [1]
): docs.oracle.com/javase/6/docs/api/java/net/URLDecoder.html
username=james&username=smith&password=pwd1,pwd2
матиме карту з 2 значеннями для імені користувача (що є правильним), але лише 1 значенням для пароля (що є неправильним)
Java 8
return Collections.list(httpServletRequest.getParameterNames())
.stream()
.collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
Я боюся, що немає можливості отримати параметри рядка запиту, проаналізовані окремо від параметрів повідомлення. До речі, той факт, що такий API відсутній, може означати, що, мабуть, вам слід перевірити свій дизайн. Чому ви використовуєте рядок запиту під час надсилання POST? Якщо ви дійсно хочете надіслати більше даних у URL-адресу, використовуйте REST-подібну конвенцію, наприклад, замість надсилання
http://mycompany.com/myapp/myservlet?first=11&second=22
казати: