O Java EE possui ServletRequest.getParameterValues () .
Em plataformas não EE, URL.getQuery () simplesmente retorna uma sequência.
Qual é a maneira normal de analisar adequadamente a sequência de consultas em uma URL quando não está no Java EE?
< discurso retórico >
É popular nas respostas para tentar criar seu próprio analisador. Este é um projeto de micro-codificação muito interessante e emocionante, mas não posso dizer que é uma boa idéia :(
Os trechos de código abaixo geralmente são falhos ou quebrados, btw. Quebrá-los é um exercício interessante para o leitor. E para os hackers que atacam os sites que os usam .
A análise de cadeias de consulta é um problema bem definido, mas a leitura das especificações e a compreensão das nuances não são triviais. É muito melhor deixar que algum codificador de biblioteca de plataforma faça o trabalho duro e faça a correção para você!
< / rant >
getQuery()
e do que deseja obter como saída?ServletRequest
.Respostas:
Desde o Android M, as coisas ficaram mais complicadas. A resposta de android.net.URI .getQueryParameter () possui um erro que quebra os espaços antes do JellyBean. O Apache URLEncodedUtils.parse () funcionou, mas foi preterido em L e removido em M .
Então a melhor resposta agora é UrlQuerySanitizer . Isso existe desde o nível 1 da API e ainda existe. Também faz você pensar em questões complicadas, como lidar com caracteres especiais ou valores repetidos.
O código mais simples é
Se você estiver satisfeito com o comportamento de análise padrão, poderá:
mas certifique-se de entender qual é o comportamento padrão da análise, pois pode não ser o que você deseja.
fonte
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL);
String value = sanitizer.getValue("parameter");
UrlQuerySanitizer
no sdk-23 tem apenas um método #sanitize()
_
. Eu tive que ir com stackoverflow.com/a/35638979/1155282No Android:
fonte
No Android, as bibliotecas Apache fornecem um analisador de consultas:
http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html e http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/ http / client / utils / URLEncodedUtils.html
fonte
URLEncodedUtils.parse()
retorna umList
que você precisaria percorrer para encontrar o valor de uma chave específica. Seria muito melhor se isso retornasse algoMap
parecido na resposta de BalusC.are
realmente úteis. Simplesmente ver algumas sugestões sobre o que pode estar errado com o código já é uma grande ajuda para pensar por mim mesmo. E lembre-se, eu não quis dizer "rolar o seu próprio é melhor", mas sim que é ótimo ter um bom material para uma decisão informada no meu próprio código.Aqui está a resposta do BalusC , mas ele compila e retorna resultados:
fonte
String pair[] = param.split("=");
paraString pair[] = param.split("=", 2);
dividir a chave = valor par apenas na primeira ocorrência. Eu acredito que é permitido ter sinais de igualdade não codificados no valor.Se você possui bibliotecas jetty (servidor ou cliente) em seu caminho de classe, pode usar as classes utilitárias jetty (consulte javadoc ), por exemplo:
fonte
Se você estiver usando o Spring 3.1 ou superior (caramba, esperava que o suporte voltasse mais), você pode usar o
UriComponents
eUriComponentsBuilder
:components.getQueryParams()
retorna umMultiValueMap<String, String>
Aqui está mais uma documentação .
fonte
Para um servlet ou uma página JSP, é possível obter pares de chave / valor da string de consulta usando request.getParameter ("paramname")
Existem outras maneiras de fazer isso, mas é assim que faço em todos os servlets e páginas jsp que eu crio.
fonte
No Android, eu tentei usar resposta @diyism mas encontrou o problema caractere de espaço levantada por @rpetrich, por exemplo: eu preencher um formulário onde
username = "us+us"
epassword = "pw pw"
causando uma seqüência de URL para se parecer com:No entanto, o código @diyism retorna
"us+us"
e"pw+pw"
, ou seja, ele não detecta o caractere de espaço. Se o URL foi reescrito com%20
o caractere de espaço, é identificado:Isso leva à seguinte correção:
fonte
replace(" ", "%20")
isso parece errado. Mas fiz o truque para mim: DA análise da string de consulta é um pouco mais complicada do que parece, dependendo de como você deseja perdoar.
Primeiro, a cadeia de caracteres da consulta é bytes ascii. Você lê esses bytes um de cada vez e os converte em caracteres. Se o personagem é? ou & então sinaliza o início do nome de um parâmetro. Se o caractere for =, ele sinaliza o início de um valor de parâmetro. Se o caractere for%, ele sinaliza o início de um byte codificado. Aqui é onde fica complicado.
Quando você lê um% char, precisa ler os próximos dois bytes e interpretá-los como dígitos hexadecimais. Isso significa que os próximos dois bytes serão 0-9, af ou AF. Cole esses dois dígitos hexadecimais para obter o valor em bytes. Mas lembre-se, bytes não são caracteres . Você precisa saber qual codificação foi usada para codificar os caracteres. O caractere é não codifica o mesmo em UTF-8 como em ISO-8859-1. Em geral, é impossível saber qual codificação foi usada para um determinado conjunto de caracteres. Eu sempre uso UTF-8 porque meu site está configurado para sempre servir tudo usando UTF-8, mas na prática você não pode ter certeza. Alguns user-agents dirão a codificação de caracteres na solicitação; você pode tentar ler isso se tiver uma solicitação HTTP completa. Se você apenas tem um URL isolado, boa sorte.
De qualquer forma, supondo que você esteja usando UTF-8 ou alguma outra codificação de caracteres de vários bytes, agora que você decodificou um byte codificado, você deve separá-lo até capturar o próximo byte. Você precisa de todos os bytes codificados que estão juntos porque não é possível decodificar por URL um byte por vez. Separe todos os bytes que estão juntos e decodifique-os todos de uma vez para reconstruir seu personagem.
Além disso, fica mais divertido se você quiser ser indulgente e prestar contas de agentes de usuários que alteram URLs. Por exemplo, alguns clientes de webmail codificam duas vezes as coisas. Ou dobre os caracteres? & = (Por exemplo:)
http://yoursite.com/blah??p1==v1&&p2==v2
. Se você quiser tentar lidar com isso com delicadeza, precisará adicionar mais lógica ao seu analisador.fonte
No Android, é simples como o código abaixo:
Além disso, se você não deseja registrar cada chave de consulta esperada, use:
Antes de ligar:
fonte
Eu tenho métodos para conseguir isso:
1) :
2) e a maneira mais fácil de fazer isso usando a classe Uri :
e este é um exemplo de como usar um dos dois métodos:
o valor de tagValue é
800
fonte
No Android, você pode usar o método estático Uri.parse da classe android.net.Uri para fazer o trabalho pesado. Se você estiver fazendo alguma coisa com URIs e Intents, precisará usá-lo de qualquer maneira.
fonte
Apenas para referência, é com isso que eu acabei (baseado em URLEncodedUtils e retornando um mapa).
Recursos:
request.getQueryString()
)Map
List<String>
Código:
Um auxiliar de compatibilidade (os valores são armazenados em uma matriz String, assim como em ServletRequest.getParameterMap () ):
fonte
Isso funciona para mim. Não sei por que todos estavam atrás de um Mapa, Lista> Tudo que eu precisava era de um simples valor de nome Mapa.
Para simplificar, usei a compilação em URI.getQuery ();
fonte
O Multimap da Guava é mais adequado para isso. Aqui está uma versão curta e limpa:
fonte
O Apache AXIS2 possui uma implementação independente de QueryStringParser.java. Se você não estiver usando o Axis2, faça o download do código-fonte e do caso de teste aqui -
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java
fonte
Originalmente respondido aqui
No Android, há a 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 tem muitas funções para extrair pares de valores-chave de consulta.
A função a seguir retorna pares de valores-chave na forma de HashMap.
Em Java:
Em Kotlin:
fonte
Eu não acho que exista um no JRE. Você pode encontrar funções semelhantes em outros pacotes como o Apache HttpClient. Se você não usa nenhum outro pacote, basta escrever o seu. Não é tão difícil. Aqui está o que eu uso,
fonte
Com base na resposta do BalusC, escrevi um exemplo de código Java:
fonte
fonte
Use o Apache HttpComponents e conecte-o com algum código de coleção para acessar parâmetros por valor: http://www.joelgerard.com/2012/09/14/parsing-query-strings-in-java-and-accessing-values-by -chave/
fonte
usando o Goiaba:
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
esse método pega o uri e retorna o mapa do nome e valor nominal
fonte
Você diz "Java" mas "não Java EE". Você quer dizer que você está usando JSP e / ou servlets, mas não uma pilha Java EE completa? Se for esse o caso, você ainda deve ter request.getParameter () disponível para você.
Se você quer dizer que está escrevendo Java, mas não está escrevendo JSPs nem servlets, ou que está apenas usando Java como ponto de referência, mas está em alguma outra plataforma que não possui análise de parâmetro integrada ... Uau , isso soa apenas como uma pergunta improvável, mas, se sim, o princípio seria:
(Eu poderia escrever código Java, mas isso não faria sentido, porque se você tiver Java disponível, poderá usar request.getParameters.)
fonte