# HttpClient executeMethod Problem



## Matthis (7. November 2009)

Nabend,

ich habe ein Problem mit der executeMethod bei der Get Methode und zwar verfängt sich das Programm dann in einer Art Endlosschleife.
Dies liegt wohl am Code der Website (, den ich auch nur sehen kann, wenn ich in Firefox auf Stoppen drücke, sonst ist der Quellcode quasi leer und er lädt dauerhaft weiter):

```
<body onLoad='bodyLoad()' class='margin noborder'>
<script>
function bodyLoad()
{
  window.setTimeout('location.reload()', 5000);
}
function bodyScroll()
{
  window.scrollBy(0, 4);
  window.setTimeout('bodyScroll()', 80);
}
bodyScroll();
</script>

<h3>Regeln für den Chat</h3>
.....
```

Ich habe keine Ahnung von JavaScript, aber das sieht so aus, als würde er die Seite immer wieder neu laden, was bei einem Chat ja auch Sinn macht. Mit HttpClient kann ich die Seite deswegen aber nicht auslesen, deswegen wollte ich fragen, ob es einen Weg gibt, dass ich dem HttpClient sagen kann, dass er den <script> Teil nicht ausführt.
An meinem Java-Code kann es eigentlich nicht liegen, denn mit andern HTML-Dokumenten funktioniert er wunderbar.

Mit freundlichen Grüßen,
Matthis


----------



## kabel2 (7. November 2009)

HttpClient interpretiert das eingebettete JavaScript nicht.
Hier sind zwei schöne Grafiken, die zeigen, welche Teile eines Browsers von HttpClient implementiert werden.

Eventuell verräts Du uns die Seite, oder ist das ein top-secret firmeninterner Prototyp? 
Und eventuell ein bissi Code 

executeMethod? sic? Dann benutzt Du den HttpClient Version < 4, der HttpClient Version 4 hat keine #executeMethod() Methode.
Laut Release Notes sollte man den HttpClient mit Version < 4 wegschmeißen (es liest sich zumindest so, IMO)

Was man für einen Schwachfug patentieren kann. Tststs...


----------



## Matthis (8. November 2009)

Hallo kabel2,

oh, also sollte ich zum HttpClient 4 wechseln, bevor ich das hier weitercode, oder geht das schon noch mit dem 3er? Den Link kann ich leider nicht schicken, nicht weil es ein supergeheimer firmeninterner Prototyp ist, aber es geht um unseren Schulserver, für den man eben auch ein Passwort benötigt.
Ich versuch aber mal soviel Code rauszuholen, wie es geht: 
Also der Chat besteht erstmal aus drei iframes, einmal send.php, also einem TextField und Button, das habe ich verstanden und Nachrichten kann ich auch senden. Außerdem online.php, eine einfache Liste, wer halt gerade online ist (auch kein Problem) und als letztes das iframe, wo die Nachrichten angezeigt werden, das heißt "view.php?type=public&room=AtheChat". Wenn ich dem Link also folge, um den Quellcode zu sehen, dann sieht das erstmal so aus: 
	

	
	
		
		

		
			




Und er aktualisiert halt durchgehend, das hört nich einmal auf zu drehen.
Und wenn ich mir jetzt den Quellcode anguggen will, dann seh ich nur ne weiße Seite. Erst wenn ich das Aktualisieren abbreche, dann seh ich einen Quellcode und zwar diesen hier:

```
<!doctype html public '-//W3C//DTD HTML 4.01 Transitional//EN'>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<title>IServ athenetz.de</title>
<link rel='stylesheet' type='text/css' href='../format.css?9.10.28-1'>
</head>

<body onLoad='bodyLoad()' class='margin noborder'>
<script>
function bodyLoad()
{
  window.setTimeout('location.reload()', 5000);
}
function bodyScroll()
{
  window.scrollBy(0, 4);
  window.setTimeout('bodyScroll()', 80);
}
bodyScroll();
</script>

<h3>Regeln für den Chat</h3>
<ul><li>Keine rassistischen, pornographischen oder gewaltverherrlichenden Äußerungen.</li>

<li>Keine irreführenden Nicknames.</li>
<li>Keine Beleidigungen! Streitigkeiten mit anderen lassen sich auch austragen, ohne ausfallend zu werden.</li>
<li>Nicht alles in Großbuchstaben schreiben. Großbuchstaben stehen im Chat für lautes Schreien.</li>
<li>Kein endloses Wiederholen von Sätzen, URLs oder sinnloser Zeichenfolgen.</li>
<li>Racheaktionen und private Streitereien haben nichts im Chat zu suchen und werden geahndet.</li></ul>
<p>
<font color='#000000'><i>Matthis betritt den Raum</i></font><br>
<script>setTimeout("parent.online.location = 'online.php?type=public&room=AtheChat'", 1);</script>
<font color='#000000'><i>Matthis verlässt den Raum</i></font><br>

<script>setTimeout("parent.online.location = 'online.php?type=public&room=AtheChat'", 1);</script>
```
Was kann man nun also machen, um das irgendwie mit dem HttpClient hinzubekommen?
Mein jetziger Sourcecode sieht so aus:

```
public void refreshview() {
		GetMethod get1 = new GetMethod("http://athenetz.de/idesk/chat/view.php?type=public&room=AtheChat");
		try {
			client.executeMethod(get1);
			System.out.println(get1.getResponseBodyAsString());
		} catch (IOException e) {
			System.err.println("Login-Fehler (IOException) Stack-Trace:");
	    	e.printStackTrace();
		} finally {
			get1.releaseConnection();
		}
	}
```
Und beim client.executeMethod(get1) hängt er sich auf und ich kann nichts mehr machen.

Ich hoffe, mein Problem ist jetzt etwas besser nachzuvollziehen.
MfG Matthis

PS: Es handelt sich um ein Server mit und von iserv.eu


----------



## kabel2 (9. November 2009)

Ich verstehe gerade nicht warum das nicht zurückkommt.
HttpClient interpretiert nichts, IFrames sind eine HTML-Geschichte.
Wie sieht es denn mit der Authentifizierung aus? Wird das im Code irgendwo gemacht?

Ansonsten sollte ich mich wohl in Zukunft mehr auf ein bekanntes Nuhrsches Zitat halten ;-)


----------



## Matthis (9. November 2009)

Ja und zwar mit dieser Methode:

```
public boolean login(String name, char[] pw) {
		PostMethod post1 = new PostMethod("http://athenetz.de/idesk/");
	    post1.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
	    post1.addParameter("login_act", name);
	    post1.addParameter("login_pwd", new String(pw));
	    try {
	    	if (client.executeMethod(post1) == 302) {
	    		login = true;
	    	}
	    } catch (IOException e) {
	    	System.err.println("Login-Fehler (IOException) Stack-Trace:");
	    	e.printStackTrace();
	    } finally {
	    	post1.releaseConnection();	
	    }
	    return login;
	}
```
Ich weiß, dass der Weg über den Status-Code zum Überprüfen, ob das Einloggen geklappt hat, nicht der eleganteste ist, aber das ist auch erstmal nur zum Testen. Die Methode wird durch diese hier aufgerufen:

```
public void loginbutton() {
		if (name.getText() != "" && pass.getPassword().length != 0) {
			if (chatbot.login(name.getText(), pass.getPassword())) {
				center.append("\nLogin erfolgreich!");
			} else {
				center.append("\nLogin nicht erfolgreich");
			}
		}
		chatbot.refreshview();
	}
```
Die refreshview hab ich ja schon gepostet. 
Wegen "setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY)" brauch ich mich ja um die Cookies nicht mehr kümmern, oder? Auf jeden Fall klappt das Senden ja auch so.

lg, Matthis

btw: Er hängt sich ja bei der Methode refreshview() von chatbot auf, warum wird denn nicht mal mehr das "Login erfolgreich" bzw. "Login nicht erfolgreich" angezeigt. Das hatte ich mich schon desöfteren gefragt, weil ich das auch schonmal hatte, ich glaube das war bei: 

```
label.setText("wort1");
try { Thread.sleep(1500); } catch....
label.setText("wort2");
```
Dort wurde auch immer direkt sleep ausgeführt und danach "wort2" angezeigt und das erste vor dem sleep nichtmal kurz.
Ist jetzt bisschen off-Topic, aber gibt's da eine Erklärung für?


----------

