Java httpurlConnection não se conecta quando eu chamo Connect ()
-
23-09-2019 - |
Pergunta
Estou tentando escrever um programa para fazer testes automatizados no meu WebApp. Para conseguir isso, abro uma conexão usando o httpurlconnection.
Uma das páginas que estou tentando testar executa um redirecionamento de 302. Meu código de teste se parece com o seguinte:
URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
connection.connect();
system.out.println(connection.getURL().toString());
Então, digamos que o urltossend é http://www.foo.com/bar.jsp, e que esta página o redireciona para http://www.foo.com/quux.jsp. Minha declaração impressa deve imprimir http://www.foo.com/quux.jsp, certo?
ERRADO.
O redirecionamento nunca acontece e imprime o URL original. No entanto, se eu alterar a linha de conexão.Connect () com uma chamada para Connection.getResponsecode (), ele funciona magicamente.
URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
//connection.connect();
connection.getResponseCode();
system.out.println(connection.getURL().toString());
Por que estou vendo esse comportamento? Estou fazendo algo errado?
Obrigado pela ajuda.
Solução
o connect()
O método apenas cria uma conexão. Você tem que confirmar o pedido (ligando getInputStream()
, getResponseCode()
, ou getResponseMessage()
) para que a resposta seja devolvida e processada.
Outras dicas
o conectar() O método é implementado na classe de URLConnection e não é substituído pelo HttpurlConnection classe.
A classe URLConnection não está ciente do HTTP e, portanto, não deve seguir o redirecionamento HTTP, mesmo que estivesse criando uma conexão real.
Se você deseja o comportamento intrínseco ao protocolo HTTP, provavelmente deseja manter os métodos implementados na classe HttpurlConnection, como é o método getResponsecode ().
Adicione o seguinte em seu OnCreate
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
Por que você não usa HttpClient de Apache.
Tentar setFollowDredirects, como pode ajudar. Na verdade, tente getFollowRedirects
Para ver se é o problema, primeiro (improvável, pois é verdade por padrão).
Editar: Se esse não for o seu problema, eu tentaria ler algo da conexão (como você faz com getResponseCode
Mas eu tentaria também getHeaderField
Para ver se ler alguma coisa faz com que o redirecionamento seja respeitado).