Como codificar um URL para ser "navegável"?
Quero saber se existe alguma maneira de analisar um URL como este:
https://www.mysite.com/lot/of/unpleasant/folders/and/my/url with spaces &"others".xls
para dentro
https://www.mysite.com/lot/of/unpleasant/folders/and/my/url%20with%20spaces%20&%22others%22.xls
Semelhante à reescrita de URL que o Firefox faz ao colar o URL anterior, enviando-o para o servidor (sem resposta, a menos que você tenha um site como este) e copiando o URL da barra de navegação e colando-o em outro lugar.
UsandoURLEncoder#encode
dá-me esta saída (indesejada):
https%3A%2F%2Fwww.mysite.com%2Flot%2Fof%2Funpleasant%2Ffolders%2Fand%2Fmy%2Furl+with+spaces+%26%22others%22.xls
Infelizmente, recebo uma String, como mostrado no início da pergunta, usandoURLEncoder#encode
diretamente não funciona.
Eu tentei ingenuamente isso:
String evilUrl = "https://www.mysite.com/lot/of/unpleasant/folders/and/my/url with spaces &\"others\".xls";
URI uri = null;
String[] urlParts = evilUrl.split("://");
String scheme = urlParts[0];
urlParts = urlParts[1].split("/");
String host = urlParts[0];
StringBuilder sb = new StringBuilder('/');
for (int i = 1; i < urlParts.length; i++) {
sb.append('/');
sb.append(urlParts[i]);
}
uri = new URI(scheme, host, sb.toString(), null);
System.out.println(uri.toASCIIString());
E fornece essa (melhor) saída:
https://www.mysite.com/lot/of/unpleasant/folders/and/my/url%20with%20spaces%20&%22others%22.xls
Mas não tenho certeza se existe uma solução pronta para esse problema e estou quebrando a cabeça por nada ou se posso confiar que esse trecho de código possa resolver quase com êxito o meu problema.
A propósito, eu já visitei alguns recursos sobre este tópico:
Codificação de URL Java dos parâmetros da string de consultaCodificação de endereço de URL HTTP em JavaURLEncoder não consegue converter caracteres de espaço