ti-enxame.com

java.io.IOException: o servidor retorna o código de resposta HTTP 505

Eu tenho consultas baseadas em HTML no meu código e um tipo específico parece dar origem a IOExceptions ao receber uma resposta 505 do servidor. Procurei a resposta 505 junto com outras pessoas que pareciam ter problemas semelhantes. Aparentemente, 505 significa incompatibilidade de versão HTTP, mas quando eu copio a mesma URL de consulta em qualquer navegador (tentei firefox, seamonkey e Opera), parece não haver problema. Uma das postagens que li sugeriu que os navegadores poderiam lidar automaticamente com o problema de incompatibilidade de versão.

Tentei ir mais fundo usando a ferramenta de desenvolvedor Nice que vem com o Opera, e parece que não há incompatibilidade nas versões (acredito que Java usa HTTP 1.1) e um bom 200 OK resposta recebida. Por que encontro problemas quando a mesma consulta passa pelo meu código Java?

     private InputStream openURL(String urlName) throws IOException{    
    URL url = new URL(urlName);
    URLConnection urlConnection = url.openConnection();
    return urlConnection.getInputStream();
 }

link de exemplo: http://www.uniprot.org/uniprot/?query=mnemonic%3aNUGM_HUMAN&format=tab&columns=id,entry%20name,reviewed,organism,length

19
posdef

Houve alguns problemas no Tomcat com URLs contendo espaço nele. Para corrigir o problema, você precisa codificar seu URL com URLEncoder.

Exemplo (observe o espaço):

String url="http://example.org/test test2/index.html";
String encodedURL=Java.net.URLEncoder.encode(url,"UTF-8");
System.out.println(encodedURL); //outputs http%3A%2F%2Fexample.org%2Ftest+test2%2Findex.html
41
user508434

Como desenvolvedor em www.uniprot.org, tenho a vantagem de poder procurar nos logs de solicitação. No último ano, de acordo com os registros, não enviamos um código de resposta 505. De qualquer forma, nossos servidores entendem as solicitações http 1, bem como a http1.1 padrão (embora você possa não obter os resultados esperados).

Isso me faz suspeitar que havia algum tipo de corrupção de dados no caminho. Ou você foi afetado por uma falha de hardware (ultimamente, tivemos alguns problemas com um switch e um datacenter inteiro;). De qualquer forma, se você tiver dúvidas ou problemas com o uniprot.org, entre em contato com [email protected], para ver se podemos ajudar/corrigir o problema.

Seu snippet de código parece normal e deve funcionar.

Atenciosamente, Jerven Bolleman

8
Jerven

da documentação da API para a classe URL :

A classe da URL não codifica ou decodifica nenhum componente da URL. É de responsabilidade do chamador codificar quaisquer campos que precisam ser escapados antes da URL de chamada e também decodificar quaisquer campos escapados retornados do URL.

portanto, se você tiver algum espaço no seu URL-str, codifique-o antes de chamar o novo URL (url-str)

3
Legna

Você está atrás de um proxy? Este código funciona para mim e imprime o mesmo texto que vejo através de um navegador.

final URL url = new URL("http://www.uniprot.org/uniprot/?query=mnemonic%3aNUGM_HUMAN&format=tab&columns=id,entry%20name,reviewed,organism,length");
final URLConnection conn = url.openConnection();
final InputStream is = conn.getInputStream();
System.out.println(IOUtils.toString(is));

conn é uma instância de HttpURLConnection

2
Jon Freedman

@posdef Eu estava tendo o mesmo problema de código de erro HTTP 505. Quando colei o URL que eu estava usando no código Java no Firefox, Chrome funcionou. Mas através do código estava dando IOException. Mas finalmente cheguei a saber que na string de url havia colchetes '(' e ')', removendo-os e funcionou, então parece que eu precisava da URLEncodeing da mesma forma que os navegadores.

2
shreyas