Pergunta

Eu tenho consultas baseadas em HTML no meu código e um tipo específico parece dar origem a IOExceptions Ao receber 505 resposta do servidor. Eu procurei a resposta 505, juntamente com outras pessoas que pareciam ter problemas semelhantes. Aparentemente, o 505 significa Incompatibilidade da Versão HTTP, mas quando copio o mesmo URL de consulta para qualquer navegador (tentou Firefox, Seamonkey e Opera), parece não haver problema. Uma das postagens que li sugeriu que os navegadores pudessem lidar automaticamente com o problema de incompatibilidade da versão.

Eu tentei cavar profundamente usando a boa ferramenta de desenvolvedor que vem com ópera, e parece que não há incompatibilidade nas versões (acredito que Java usa o HTTP 1.1) e um bom 200 OK resposta é recebida. Por que tenho 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 amostra: http://www.uniprot.org/uniprot/?query=mnemonic%3aNUGM_HUMAN&format=tab&columns=id,entry%20name,reviewed,organism,length

Foi útil?

Solução

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

Outras dicas

Como desenvolvedor em www.uniprot.org, tenho a vantagem de poder procurar nos logs da solicitação. No ano passado, de acordo com os logs, não enviamos um código de resposta 505. De qualquer forma, nossos servidores entendem solicitações HTTP 1, bem como o HTTP1.1 padrão (embora você não obtenha os resultados que espera).

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

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

Atenciosamente, Jerven Bolleman

da documentação da API para o Url classe:

A classe URL não codifica ou decodifica nenhum componente de URL [...]. É de responsabilidade do chamador codificar quaisquer campos, que precisam ser escapados antes de ligar para o URL e também para decodificar quaisquer campos escapados, que sejam devolvidos do URL.

Portanto, se você tiver algum espaços em seu URL-STR, codifique-o antes de ligar para o novo URL (URL-STR)

Você está por trás de um proxy? Esse 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

@Posdef Eu estava tendo o mesmo problema de erro de erro HTTP. Quando colei o URL que eu estava usando no código Java no Firefox, o Chrome funcionou. Mas através do código estava dando IoException. Mas, finalmente, eu sabia que na corda da URL havia colchetes '(' e ')', ao removê -los, funcionou para que eu pareça que eu precisava de urlencidação da mesma forma que os navegadores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top