У меня есть URI, как это:
https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback
Мне нужна коллекция с разобранными элементами:
NAME VALUE
------------------------
client_id SS
response_type code
scope N_FULL
access_type offline
redirect_uri http://localhost/Callback
Точнее , мне нужен Java-эквивалент для метода C # /. NET HttpUtility.ParseQueryString .
Пожалуйста, дайте мне совет по этому поводу.
Спасибо.
java
parsing
uri
namevaluecollection
Сергей Шафиев
источник
источник
java.net.URI
/java.net.URL
?Ответы:
Если вы ищете способ достичь этого без использования внешней библиотеки, вам поможет следующий код.
Вы можете получить доступ к возвращенной карте, используя
<map>.get("client_id")
URL-адрес, указанный в вашем вопросе, который будет возвращать «SS».ОБНОВЛЕНИЕ URL-декодирование добавлено
ОБНОВЛЕНИЕ Поскольку этот ответ все еще довольно популярен, я сделал улучшенную версию описанного выше метода, которая обрабатывает несколько параметров с одним и тем же ключом и параметры без значения.
ОБНОВЛЕНИЕ Java8 версия
Запуск вышеуказанного метода с URL
https://stackoverflow.com?param1=value1¶m2=¶m3=value3¶m3
возвращает эту карту:
источник
org.apache.http.client.utils.URLEncodedUtils
это известная библиотека, которая может сделать это для вас
Выходы
источник
List<NameValuePair>
вMap<String,String>
Java тривиально,map.get("one")
если у вас нет доступа к скобкам для хэш-карт, это будет выглядеть так: если вы не знаете, как это сделать, это должен быть другой вопрос (но сначала попробуйте самостоятельно) , Мы предпочитаем держать вопросы тонкими здесь в SOSystem.out.println(URLEncodedUtils.parse(new URI("http://example.com/?foo=bar&foo=baz"), "UTF-8"));
напечатает [foo = bar, foo = baz] .URLEncodedUtils and
NameValuePair` больше не доступны (если только вы не добавите зависимость в устаревшую библиотеку Apache, как описано здесь ).Если вы используете Spring Framework:
Ты получишь:
источник
UriComponentsBuilder.fromHttpUrl(url)
используйте Google Guava и сделайте это в 2 строки:
что дает вам
источник
uri
вы должны использовать, такnew java.net.URL(uri).getQuery()
как это покупает вам бесплатную проверку ввода в URL.splitter.split()
будет выдано,IllegalArgumentException
если в строке запроса есть повторяющийся ключ. См. Stackoverflow.com/questions/1746507/…Самый короткий путь, который я нашел, это:
ОБНОВЛЕНИЕ:
UriComponentsBuilder
приходит с весны. Здесь ссылка .источник
Для Android, если вы используете OkHttp в своем проекте. Вы могли бы взглянуть на это. Это просто и полезно.
источник
Java 8 одно утверждение
Учитывая URL для анализа:
Это решение собирает список пар:
Это решение, с другой стороны, собирает карту (учитывая, что в URL может быть больше параметров с тем же именем, но с разными значениями).
Оба решения должны использовать служебную функцию для правильного декодирования параметров.
источник
Если вы используете сервлет DoGet попробуйте это
источник
HttpServletRequest
и это работаетMockHttpServletRequest
также в модульных тестах Mock MVC.Если вы используете Java 8 и хотите написать несколько методов многократного использования, вы можете сделать это в одну строку.
Но это довольно жестокая линия.
источник
На Android есть класс Uri в пакете android.net . Обратите внимание, что Uri является частью android.net , а URI - частью java.net .
У класса Uri есть много функций для извлечения пар ключ-значение из запроса.
Следующая функция возвращает пары ключ-значение в виде HashMap.
В Java:
В Котлине:
источник
Используя вышеупомянутые комментарии и решения, я сохраняю все параметры запроса, используя Map <String, Object>, где Objects может быть либо строкой, либо Set <String>. Решение приведено ниже. Рекомендуется сначала использовать какой-либо валидатор URL, чтобы проверить его, а затем вызвать метод convertQueryStringToMap.
источник
Я попробовал Kotlin-версию, увидев, как это лучший результат в Google.
И методы расширения
источник
Готовое решение для декодирования части запроса URI (включая декодирование и многопараметрические значения)
Комментарии
Я не был доволен кодом, предоставленным @ Pr0gr4mm3r в https://stackoverflow.com/a/13592567/1211082 . Решение на основе Stream не выполняет URLDecoding, изменчивая версия неуклюже.
Таким образом, я разработал решение, которое
Map<String, List<Optional<String>>>
Optional.empty()
вместоnull
)URLdecode
UnsupportedEncodingException
в исключение времени выполнения,RuntimeUnsupportedEncodingException
которое позволяет взаимодействовать с потоком. (Оборачивать обычную функцию в функции, вызывающие проверенные исключения, очень сложно. И ScalaTry
недоступна в языке Java по умолчанию.)Java-код
Скала код
... и ради полноты я не могу удержаться, чтобы предложить решение в Scala, в котором преобладают краткость и красота
источник
Просто обновление до версии Java 8
Методы mapping и toList () должны использоваться с Collectors, которые не были упомянуты в верхнем ответе. В противном случае это приведет к ошибке компиляции в IDE.
источник
splitQueryParameters()
методом? И что с**Collectors**
?Ответ Котлина с первоначальной ссылкой на https://stackoverflow.com/a/51024552/3286489 , но с улучшенной версией, приводящей в порядок коды и предоставляющей 2 версии, и использующей неизменяемые операции сбора
Используйте
java.net.URI
для извлечения запроса. Затем используйте предоставленные ниже функции расширения.page2&page3
получите{page=3}
, используйте функцию расширения нижеpage2&page3
получит{page=[2, 3]}
Способ использовать его, как показано ниже
источник
Netty также предоставляет хороший синтаксический анализатор строки запроса
QueryStringDecoder
. В одной строке кода он может анализировать URL в вопросе. Мне нравится, потому что это не требует ловли или броскаjava.net.MalformedURLException
.В одной строке:
Смотрите javadocs здесь: https://netty.io/4.1/api/io/netty/handler/codec/http/QueryStringDecoder.html
Вот короткий, самостоятельный, правильный пример:
который генерирует
источник
Отвечаю здесь, потому что это популярная тема. Это чистое решение в Котлине, которое использует рекомендуемые
UrlQuerySanitizer
API. Смотрите официальную документацию . Я добавил конструктор строк для объединения и отображения параметров.источник
Вот мое решение с помощью Reduce и Optional :
Optional<SimpleImmutableEntry<String, String>>
чтобы игнорировать мусор позжеВ случае, если вы спросите, Reduce требует этого странного объединителя в последнем параметре, который используется только в параллельных потоках. Его цель - объединить два промежуточных результата (здесь HashMap).
источник
Если вы используете Spring, добавьте аргумент типа
@RequestParam Map<String,String>
в ваш метод контроллера, и Spring создаст карту для вас!источник