2010-01-28 13 views
7

Ich versuche, ein Programm zu schreiben, das automatisierte Testen auf meine Webapp zu tun. Um dies zu erreichen, öffne ich eine Verbindung mit HttpURLConnection.Java HttpURLConnection Verbindung nicht, wenn ich eine Verbindung() aufrufen

Eine der Seiten, die ich zu Test bin versucht, führt eine 302-Umleitung. Mein Test-Code sieht wie folgt aus:

URL currentUrl = new URL(urlToSend); 
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection(); 
connection.connect(); 
system.out.println(connection.getURL().toString()); 

So lassen Sie uns sagen, dass urlToSend ist http://www.foo.com/bar.jsp, und dass diese Seite leitet Sie auf http://www.foo.com/quux.jsp. Meine println-Anweisung sollte http://www.foo.com/quux.jsp ausdrucken, oder?

FALSCH.

Die Umleitung nie passiert, und es druckt die Original-URL aus. Wenn ich jedoch die connection.connect() - Zeile mit einem Aufruf von connection.getResponseCode() umschalte, funktioniert das auf magische Weise.

URL currentUrl = new URL(urlToSend); 
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection(); 
//connection.connect(); 
connection.getResponseCode(); 
system.out.println(connection.getURL().toString()); 

Warum sehe ich dieses Verhalten? Mache ich etwas falsch?

Danke für die Hilfe.

Antwort

16

Die connect() Methode erstellt gerade eine Verbindung her. Sie müssen die Anforderung bestätigen (indem Sie getInputStream(), getResponseCode() oder getResponseMessage() aufrufen), damit die Antwort zurückgegeben und verarbeitet werden kann.

+0

Danke, das scheint der Fall zu sein! – sangfroid

+1

Vielen Dank dafür! Ich habe versucht zu verstehen, warum Leute getInputStream() und dergleichen ausgeben, ohne jemals connect() aufzurufen. Das hast du mir gerade klargestellt. – Renatinn

0

Versuchen setFollowRedirects, wie es helfen könnte. Versuchen Sie mal, getFollowRedirects, um zu sehen, ob es das Problem ist, zuerst (unwahrscheinlich, da es standardmäßig wahr ist).

Edit: Wenn dies nicht Ihr Problem ist, ich würde versuchen, etwas aus dem Zusammenhang zu lesen (wie Sie mit getResponseCode tun, aber ich würde auch versuchen, getHeaderField zu sehen, ob überhaupt etwas zu Lesen die Umleitung verursacht respektiert werden).

+0

versucht bereits, getFollowRedirects gibt true zurück. Außerdem habe ich ein separates Problem mit setFollowRedirects in einem separaten Test. Im Grunde tut setInstanceFollowRedirects() nichts, während setFollowRedirects() tut, was es soll. Ich dachte mir jedoch, es wäre besser, in einem separaten Post darüber zu fragen, da es sich um ein separates Problem handelt. – sangfroid

+1

@sangfroid Ich denke, Sie werden feststellen, dass Sie tatsächlich etwas aus der Verbindung lesen müssen, damit die Weiterleitung gelesen/respektiert wird. –

1

Die Methode connect() ist in der Klasse URLConnection implementiert und wird nicht von der Klasse HttpURLConnection überschrieben.

Die URLConnection-Klasse kennt HTTP nicht und sollte daher der HTTP-Weiterleitung nicht folgen, auch wenn sie eine echte Verbindung erstellt hat.

Wenn Sie ein dem HTTP-Protokoll innewohnendes Verhalten wünschen, sollten Sie sich wahrscheinlich an Methoden halten, die in der HttpURLConnection-Klasse implementiert sind, wie die getResponseCode() -Methode lautet.

0

die folgenden in Ihrem onCreate hinzufügen

StrictMode.ThreadPolicy policy = new StrictMode. 
ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
Verwandte Themen