2010-09-02 11 views
15

Ich habe HTML-basierte Abfragen in meinem Code und eine bestimmte Art scheint IOExceptions bei Erhalt 505 Antwort vom Server zu verursachen. Ich habe die 505-Antwort zusammen mit anderen Leuten nachgeschlagen, die ähnliche Probleme zu haben scheinen. Anscheinend steht 505 für eine nicht übereinstimmende HTTP-Version, aber wenn ich die gleiche Abfrage-URL in einen beliebigen Browser kopiere (versuchte Firefox, Seatonkey und Opera), scheint es kein Problem zu geben. Einer der Posts, die ich las, schlug vor, dass die Browser das Versionskonfliktproblem automatisch behandeln würden.java.io.IOException: Server gibt HTTP-Antwortcode zurück 505

Ich habe versucht, tiefer zu graben, indem ich das nette Entwicklerwerkzeug verwende, das mit Opera kommt, und es sieht aus, als gäbe es keinen Unterschied in Versionen (ich glaube, Java verwendet HTTP 1.1) und eine nette 200 OK Antwort erhalten wird. Warum treten Probleme auf, wenn dieselbe Abfrage meinen Java-Code durchläuft?

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

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

Antwort

38

Es hat mit URLs in Tomcat Aufnahmeraum in es einige Probleme gewesen. Um das Problem zu beheben, müssen Sie Ihre URL mit URLEncoder codieren.

Beispiel (der Raum bemerken):

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

Ich hatte auch das gleiche Problem mit Tomcat 7.0.8 und benötigt, um einen der Parameter zu kodieren. Aber es gibt noch mehr: Die Anfrage wurde von Tomcat perfekt gehandhabt, wenn es mit Firefox gemacht wurde! – Pragmateek

+0

Danke! Ich hatte das gleiche Problem und Ihre Antwort hat mein Problem gelöst. –

+3

Ich habe die Leerzeichen in meiner URL durch% 20 ersetzt. Vielen Dank, dieses Problem behoben – Chris

2

Sind Sie hinter einem Proxy? Dieser Code funktioniert für mich und druckt den gleichen Text aus, den ich in einem Browser sehe.

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 ist eine Instanz HttpURLConnection

+0

Nein es gibt keinen Proxy hier, soweit ich weiß .. Ich habe den vereinfachten Fall ausprobiert wie du es hier geschrieben hast und es scheint auch bei mir zu funktionieren, komisch .. Den Fullscale Test nochmal ausführen um zu sehen ob der Problem bleibt jedoch bestehen, aber es dauert eine lange Zeit, um die Ergebnisse zu sehen. Falls ich noch die Ausnahme bekomme, werde ich den Beitrag mit dem Stack-Trace aktualisieren. – posdef

8

als Entwickler bei www.uniprot.org Ich habe den Vorteil, dass sie in die Anforderungsprotokolle zu suchen. Im letzten Jahr haben wir gemäß den Logs keinen 505 Response Code gesendet. In jedem Fall verstehen unsere Server http 1 Anfragen sowie die Standard http1.1 (obwohl Sie möglicherweise nicht die erwarteten Ergebnisse erhalten).

Das lässt mich vermuten, dass es auf dem Weg eine Art von Datenkorruption gab. Oder Sie waren von einem Hardwarefehler betroffen (in letzter Zeit hatten wir einige Probleme mit einem Switch und einem ganzen Datacenter;). In jedem Fall, wenn Sie Fragen oder Probleme mit uniprot.org haben, wenden Sie sich bitte an [email protected] Dann können wir sehen, ob wir Ihnen helfen können, das Problem zu lösen.

Ihr Code-Snippet scheint normal und sollte funktionieren.

Grüße, Jerven Bolleman

+0

Hallo Jerven, Vielen Dank für Ihre Antwort, obwohl es trägt zu meiner Verwirrung bei (die Tatsache, dass Sie nie eine 505 gesendet haben) Es ist zu schätzen, dass Sie sich die Zeit genommen haben, durch die Protokolle zu gehen und versuchen, die möglichen Ursachen aufzuspüren. Ich habe jedoch vor ein paar Tagen eine E-Mail an den Helpdesk geschickt, als ich anfing, das Problem zu erfahren und immer noch keine Antwort bekommen habe. Ich habe mir gedacht, dass es da eine ganze Reihe von Problemen gibt, die du wahrscheinlich bewältigen musstest, also wollte ich nur sicherstellen, dass es etwas gibt, was ich an meinem Ende tun kann. :) – posdef

3

der API-Dokumentation für die URL Klasse:

Die URL-Klasse hat sich keine URL-Komponenten nicht kodieren oder dekodieren [... ]. Es liegt in der Verantwortung des Aufrufers, alle Felder zu codieren, , die vor dem Aufrufen der URL maskiert werden müssen, und auch alle maskierten Felder , die von der URL zurückgegeben werden.

also, wenn Sie alle Leerzeichen in Ihrer URL-str kodieren sie, bevor neue URL aufrufen (url-str)

2

@posdef I gleichen HTTP-Fehlercode 505 Problem hatte. Als ich die URL, die ich in Java-Code verwendet habe, in Firefox eingefügt habe, hat Chrome funktioniert. Aber durch Code wurde IOException gegeben.Aber schließlich habe ich erfahren, dass es in URL-Strings Klammern gab ('und'), durch das Entfernen von ihnen funktionierte es so, als ob ich URLEncoding wie Browser brauchte.

+0

Ich benötigte URLE-Codierung wie Browser. (Ich habe das gleiche Problem) –