Como codificar parâmetros de consulta para ir em uma url em Java? Eu sei, isso parece uma pergunta óbvia e já feita.
Existem duas sutilezas das quais não tenho certeza:
- Os espaços devem ser codificados no url como "+" ou como "% 20"? No Chrome, se eu digitar "http://google.com/foo=?bar me", o Chrome muda para ser codificado com% 20
- É necessário / correto codificar dois pontos ":" como% 3B? Chrome não.
Notas:
java.net.URLEncoder.encode
não parece funcionar, parece que a codificação de dados deve ser enviada do formulário. Por exemplo, ele codifica o espaço em+
vez de%20
e codifica dois pontos, o que não é necessário.java.net.URI
não codifica parâmetros de consulta
application/x-www-form-urlencoded
pares de chave / valor. Veja aqui para mais informações: ilegalargumentexception.blogspot.com/2009/12/…Respostas:
java.net.URLEncoder.encode(String s, String encoding)
pode ajudar também. Ele segue a codificação do formulário HTMLapplication/x-www-form-urlencoded
.Por outro lado, a codificação Porcentagem (também conhecida como codificação de URL ) codifica o espaço com
%20
. Dois pontos é um caractere reservado, então:
continuará sendo dois pontos após a codificação.fonte
URLEncoder
está em conformidade com oapplication/x-www-form-urlencoded
formato MIME (que é uma codificação de formulário HTML válida). Presumo que não seja isso que você está procurando.http://example.com/?url=http://example.com/?q=c&sort=name
. Deve codificar&sort=name
ou não? Não há como distinguir o valor do URL. Essa é a razão exata pela qual você precisa da codificação de valor em primeiro lugar.EDIT:
URIUtil
não está mais disponível em versões mais recentes, melhor resposta em Java - encode URL ou pelo Sr. Sindi neste tópico.URIUtil
do Apache httpclient é realmente útil, embora existam algumas alternativasAmbos são perfeitamente válidos no contexto certo . Embora se você realmente preferisse, você poderia emitir uma substituição de string.
fonte
URIUtil.encodeWithinQuery
é o que você usaria para codificar um parâmetro de consulta individual, que é o que a pergunta original parecia estar perguntando.Infelizmente, URLEncoder.encode () não produz codificação de porcentagem válida (conforme especificado em RFC 3986 ).
URLEncoder.encode () codifica tudo perfeitamente, exceto o espaço é codificado para "+". Todos os codificadores URI Java que consegui encontrar expõem apenas métodos públicos para codificar a consulta, o fragmento, as partes do caminho, etc. - mas não expõe a codificação "bruta". Isso é lamentável, pois o fragmento e a consulta podem codificar o espaço para +, então não queremos usá-los. O caminho está codificado corretamente, mas é "normalizado" primeiro, portanto também não podemos usá-lo para codificação "genérica".
Melhor solução que eu poderia apresentar:
E se
replaceAll()
for muito lento para você, acho que a alternativa é rolar seu próprio codificador ...EDITAR: Eu coloquei este código aqui primeiro, que não codifica "?", "&", "=" Corretamente:
fonte
+
é uma codificação perfeitamente válida de um espaço.+
pode ser interpretado incorretamente - dê uma olhada em C # blogs.msdn.microsoft.com/yangxind/2006/11/08/…encodeURIComponent
saída do método Javascript , e esta foi a única correspondência exata para as que tentei (consultas com espaços, caracteres especiais turcos e alemães).Não é necessário codificar dois-pontos como% 3B na consulta, embora isso não seja ilegal.
Também parece que apenas espaços codificados por cento são válidos, pois duvido que o espaço seja um ALFA ou um DÍGITO
consulte a especificação URI para obter mais detalhes.
fonte
application/x-www-form-urlencoded
string de consulta, qualquer uma das opções está correta. Se você estiver corrigindo um URL que o usuário digitou / colou,:
deve ser deixado sozinho.O URLEncoder Java integrado está fazendo o que deveria e você deve usá-lo.
A "+" ou "% 20" são ambos os substitutos válidos para um caractere de espaço em uma URL. Qualquer um vai funcionar.
Um ":" deve ser codificado, pois é um caractere separador. ou seja, http: // foo ou ftp: // bar . O fato de que um navegador específico pode manipulá-lo quando não está codificado não o torna correto. Você deve codificá-los.
Como uma questão de boa prática, certifique-se de usar o método que usa um parâmetro de codificação de caracteres. UTF-8 é geralmente usado lá, mas você deve fornecê-lo explicitamente.
fonte
+
é apenas uma representação do espaço emapplication/x-www-form-urlencoded
; não é garantido que funcione mesmo quando restrito a HTTP. Da mesma forma,:
é válido em uma string de consulta e não deve ser convertido para%3B
; um servidor pode escolher interpretá-los de maneira diferente.http://
ahttp%3A%2F%2F
que não é corretohttp://
parte. O método é para parâmetros de consulta e dados de formulário codificados. Se, no entanto, você quiser passar o URL de outro site como um parâmetro de consulta, ENTÃO você deseja codificá-lo para evitar confundir o analisador de URL.application/x-www-form-urlencoded
tipo de conteúdo. Isso não significa que deve funcionar para HTTP?se você tem apenas problema de espaço na url. Eu usei o código abaixo e funcionou bem
exemplo: url é
então a saída de muUrl é
fonte
Observei no caso de Datetime (Timestamp)
URLEncoder.encode(param,"UTF-8")
não funcionar.fonte