Eu tenho o URI assim:
https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback
Preciso de uma coleção com elementos analisados:
NAME VALUE
------------------------
client_id SS
response_type code
scope N_FULL
access_type offline
redirect_uri http://localhost/Callback
Para ser exato, preciso de um equivalente em Java para o método C # / .NET HttpUtility.ParseQueryString .
Por favor, me dê um conselho sobre isso.
Obrigado.
java
parsing
uri
namevaluecollection
Sergey Shafiev
fonte
fonte
java.net.URI
/java.net.URL
?Respostas:
Se você estiver procurando uma maneira de alcançá-lo sem usar uma biblioteca externa, o código a seguir o ajudará.
Você pode acessar o mapa retornado usando
<map>.get("client_id")
, com o URL fornecido na sua pergunta, isso retornaria "SS".UPDATE Decodificação de URL adicionada
ATUALIZAÇÃO Como essa resposta ainda é bastante popular, fiz uma versão aprimorada do método acima, que lida com vários parâmetros com a mesma chave e com parâmetros sem nenhum valor.
ATUALIZAÇÃO versão Java8
Executando o método acima com o URL
https://stackoverflow.com?param1=value1¶m2=¶m3=value3¶m3
retorna este mapa:
fonte
org.apache.http.client.utils.URLEncodedUtils
é uma biblioteca bem conhecida que pode fazer isso por você
Saídas
fonte
List<NameValuePair>
em umMap<String,String>
Java que não tenha acesso de colchete para mapas de hash, seria comomap.get("one")
se você não soubesse fazer isso, deveria ser outra pergunta (mas tente primeiro por conta própria) . Preferimos manter as perguntas reduzidas aqui no SOSystem.out.println(URLEncodedUtils.parse(new URI("http://example.com/?foo=bar&foo=baz"), "UTF-8"));
irá imprimir [foo = bar, foo = baz] .URLEncodedUtils and
NameValuePair` não está mais disponível (a menos que você adicione uma dependência à biblioteca Apache herdada, conforme descrito aqui ).Se você estiver usando o Spring Framework:
Você vai ter:
fonte
UriComponentsBuilder.fromHttpUrl(url)
use o Google Guava e faça-o em 2 linhas:
o que te dá
fonte
uri
você deve usar,new java.net.URL(uri).getQuery()
pois isso permite a validação gratuita da entrada no URL.splitter.split()
será lançadaIllegalArgumentException
se houver uma chave duplicada na string de consulta. Veja stackoverflow.com/questions/1746507/…A maneira mais curta que encontrei é esta:
UPDATE:
UriComponentsBuilder
vem da primavera. Aqui o link .fonte
Para Android, se você estiver usando o OkHttp em seu projeto. Você pode dar uma olhada nisso. É simples e útil.
fonte
Java 8 uma declaração
Dado o URL para analisar:
Esta solução coleta uma lista de pares:
Por outro lado, esta solução coleta um mapa (dado que em um URL pode haver mais parâmetros com o mesmo nome, mas com valores diferentes).
Ambas as soluções devem usar uma função de utilitário para decodificar adequadamente os parâmetros.
fonte
Se você estiver usando o servlet doGet, tente isso
fonte
HttpServletRequest
eMockHttpServletRequest
também nos testes de unidade do Mock MVC.Se você estiver usando o Java 8 e quiser escrever alguns métodos reutilizáveis, poderá fazê-lo em uma linha.
Mas essa é uma linha bastante brutal.
fonte
No Android, há uma classe Uri no pacote android.net . Observe que Uri faz parte do android.net , enquanto o URI faz parte do java.net .
A classe Uri possui muitas funções para extrair pares de valores-chave de uma consulta.
A função a seguir retorna pares de valores-chave na forma de HashMap.
Em Java:
Em Kotlin:
fonte
Usando os comentários e soluções mencionados acima, estou armazenando todos os parâmetros de consulta usando Map <String, Object>, em que os objetos podem ser string ou Set <String>. A solução é dada abaixo. É recomendável usar algum tipo de validador de URL para validar o URL primeiro e depois chamar o método convertQueryStringToMap.
fonte
Eu experimentei uma versão do Kotlin, vendo como esse é o melhor resultado no Google.
E os métodos de extensão
fonte
Uma solução pronta para uso para decodificação da parte da consulta URI (incluindo valores de decodificação e multiparâmetros)
Comentários
Não fiquei satisfeito com o código fornecido pelo @ Pr0gr4mm3r em https://stackoverflow.com/a/13592567/1211082 . A solução baseada em fluxo não faz URLDecoding, a versão mutável grosseira.
Assim, elaborei uma solução que
Map<String, List<Optional<String>>>
Optional.empty()
vez denull
)URLdecode
UnsupportedEncodingException
em uma exceção de tempo de execuçãoRuntimeUnsupportedEncodingException
que permite a interação com o fluxo. (Agrupar função regular em funções que lançam exceções verificadas é uma chatice. E ScalaTry
não está disponível no padrão da linguagem Java).Código Java
Código Scala
... e por uma questão de integridade, não resisto a fornecer a solução em Scala que domina a concisão e a beleza
fonte
Apenas uma atualização para a versão Java 8
Os métodos mapping e toList () devem ser usados com coletores, o que não foi mencionado na resposta superior. Caso contrário, isso geraria erro de compilação no IDE
fonte
splitQueryParameters()
método? E o que há com o**Collectors**
?Resposta de Kotlin com referência inicial de https://stackoverflow.com/a/51024552/3286489 , mas com versão aprimorada, ordenando códigos e fornecendo 2 versões, e use operações de coleta imutáveis
Use
java.net.URI
para extrair a consulta. Em seguida, use as funções de extensão fornecidas abaixopage2&page3
, obterá{page=3}
, use a função de extensão abaixopage2&page3
, obterá{page=[2, 3]}
A maneira de usá-lo como abaixo
fonte
O Netty também fornece um bom analisador de cadeias de consulta chamado
QueryStringDecoder
. Em uma linha de código, ele pode analisar o URL na pergunta. Eu gosto porque não requer pegar ou jogarjava.net.MalformedURLException
.Em uma linha:
Consulte javadocs aqui: https://netty.io/4.1/api/io/netty/handler/codec/http/QueryStringDecoder.html
Aqui está um exemplo curto, independente e correto:
o que gera
fonte
Respondendo aqui, porque este é um tópico popular. Esta é uma solução limpa no Kotlin que usa a
UrlQuerySanitizer
API recomendada . Veja a documentação oficial . Eu adicionei um construtor de strings para concatenar e exibir os parâmetros.fonte
Aqui está minha solução com reduzir e opcional :
Optional<SimpleImmutableEntry<String, String>>
para ignorar o lixo mais tardeCaso você pergunte, o reduzir exige esse estranho combinador no último parâmetro, que é usado apenas em fluxos paralelos. Seu objetivo é mesclar dois resultados intermediários (aqui HashMap).
fonte
Se você estiver usando o Spring, adicione um argumento do tipo
@RequestParam Map<String,String>
ao seu método de controlador, e o Spring construirá o mapa para você!fonte