Escapando e comercial em URLs para solicitações HttpClient
-
23-09-2019 - |
Pergunta
Então, eu tenho um código Java que usa Jakarta HttpClient assim:
URI aURI = new URI( "http://host/index.php?title=" + title + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery());
O problema é que se title
inclui qualquer e comercial (&), eles são considerados delimitadores de parâmetro e a solicitação fica complicada ...e se eu substituí-los pelo equivalente com escape de URL %26
, então isso recebe escape duplo de getEscapedPathQuery() em %2526
.
Atualmente estou resolvendo isso basicamente reparando os danos posteriormente:
URI aURI = new URI( "http://host/index.php?title=" + title.replace("&", "%26") + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getEscapedPathQuery().replace("%2526", "%26"));
Mas lá tem para ser uma maneira melhor de fazer isso, certo?Observe que o título pode conter qualquer número de caracteres UTF-8 imprevisíveis, etc., portanto, escapar de todo o resto é um requisito.
Solução
Aqui está:
import java.net.URLEncoder;
...
...
URI aURI = new URI( "http://host/index.php?title=" + URLEncoder.encode(title,"UTF-8") + "&action=edit" );
GetMethod aRequest = new GetMethod( aURI.getPathQuery());
Verificar java.net.urlencoder para mais informações.
Outras dicas
Por que você está ligando para getescapedPathQuery () se você não quer a fuga? Basta decidir quem é a responsabilidade e seja consistente.
Use o URLEncoder aula.
Classe utilitária para codificação de formulário HTML.Esta classe contém métodos estáticos para converter uma sequência no formato MIME APLICATIVO/X-WWW-FORM-FORM-URLECODED.Para obter mais informações sobre a codificação do formulário HTML, consulte a especificação HTML.