2010-09-02 20 views
15

Tengo consultas basadas en HTML en mi código y un tipo específico parece dar lugar a IOExceptions al recibir la respuesta 505 del servidor. He buscado la respuesta 505 junto con otras personas que parecían tener problemas similares. Aparentemente, 505 significa falta de coincidencia de versión HTTP, pero cuando copio la misma URL de consulta en cualquier navegador (intenté con firefox, seamonkey y Opera) parece que no hay problema. Una de las publicaciones que leí sugirió que los navegadores podrían manejar automáticamente el problema de desajuste de versión ...java.io.IOException: El servidor devuelve el código de respuesta HTTP 505

He intentado profundizar más utilizando la herramienta de desarrollador agradable que viene con Opera, y parece que no hay discrepancias en versiones (creo que Java usa HTTP 1.1) y se recibe una buena respuesta 200 OK. ¿Por qué tengo problemas cuando la misma consulta pasa por mi código Java?

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

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

Respuesta

38

Ha habido algunos problemas en Tomcat con URL que contienen espacio en él. Para solucionar el problema, debe codificar su URL con URLEncoder.

Ejemplo (nótese el espacio):

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 
+0

Tuve el mismo problema con Tomcat 7.0.8 y necesitaba codificar uno de los parámetros. Pero hay más: ¡la solicitud fue manejada perfectamente por Tomcat si se hizo con Firefox! – Pragmateek

+0

¡Gracias! Tuve el mismo problema y tu respuesta resolvió mi problema. –

+3

Reemplacé los espacios en mi url con% 20. Gracias, este problema solucionado – Chris

2

¿Está detrás de un proxy? Este código funciona para mí e imprime el mismo texto que veo a través de un 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 es una instancia de HttpURLConnection

+0

No hay ningún proxy aquí, hasta donde yo sé .. He intentado el caso simplificado como lo ha escrito aquí y parece que también funciona para mí, extraño ... Ejecutar la prueba de escala completa de nuevo para ver si el El problema aún persiste, sin embargo, lleva mucho tiempo ver los resultados. En caso de que todavía tenga la excepción, actualizaré la publicación con el seguimiento de la pila. – posdef

8

como desarrollador en www.uniprot.org tengo la ventaja de ser capaz de mirar en los registros de solicitudes. En el último año, de acuerdo con los registros, no hemos enviado un código de respuesta 505. En cualquier caso, nuestros servidores entienden las solicitudes de http 1 así como la http1.1 predeterminada (aunque es posible que no obtenga los resultados que espera).

Eso me hace sospechar que hubo algún tipo de corrupción de datos en el camino. O usted se vio afectado por una falla de hardware (últimamente hemos tenido problemas con un switch y un centro de datos completo;). En cualquier caso, si alguna vez tiene preguntas o problemas con uniprot.org, póngase en contacto con [email protected] para ver si podemos ayudar/solucionar el problema.

Su fragmento de código parece normal y debería funcionar.

Saludos, Jerven Bolleman

+0

Hola Jerven, Muchas gracias por su respuesta, aunque se suma a mi confusión (el hecho de que nunca haya enviado un 505) se agradece que se haya tomado su tiempo para revisar los registros y tratar de localizar las posibles causas. Sin embargo, he enviado un correo al servicio de asistencia hace un par de días, cuando comencé a experimentar el problema y aún no he recibido una respuesta. Pensé que hay un gran número de problemas que probablemente necesites atender allí, así que solo quería asegurarme de que hubiera algo que pudiera hacer en mi lado. :) – posdef

3

de la documentación de la API para la clase URL:

La clase URL por sí mismo no codificar o descodificar cualquier componente URL [... ] Es responsabilidad de la persona que llama codificar cualquier campo, , del cual se debe escapar antes de llamar a la URL, y también para decodificar cualquier campo escapado , que se devuelve desde la URL.

lo que si tiene espacios en su codificación URL-str antes de llamar al nuevo URL (URL-str)

2

@posdef que estaba teniendo el código de error HTTP 505 mismo problema. Cuando pegué la URL que estaba usando en código Java en Firefox, Chrome funcionó. Pero a través del código estaba dando IOException.Pero al final llegué a saber que en la cadena url había corchetes '(' y ')', al eliminarlos funcionó, así que parece que necesitaba URLEncodeing al igual que los navegadores.

+0

Necesitaba URLEncodeing al igual que los navegadores. (Tengo el mismo problema) –

Cuestiones relacionadas