# Seiteninhalte bei httpsurlconnection abfragen



## Fry (3. Feb 2007)

Hallo!

Ich möchte folgendes machen:

- eine Verbindung zu einer Seite aufbauen, vorzugsweise mit HttpsUrlConnection
- Wie man schon vermutet, ist die Seite per SSL gesichert
- Jetzt möchte ich einfach die Seite, die im Browser angezeigt werden würde parsen und darauf etwas suchen um weitere AKtionen vorzunehmen
- Das Zertifikat ist mir mal ganz egal.

Ich habe schon mal in dem Beitrag geschaut aber nicht so richtig verstanden. Um es kurz zu machen, etwas wie:


```
try {
			URL u = new URL("https://www.123.de");
			HttpsURLConnection hp = (HttpsURLConnection)u.openConnection();
			Object object = hp.getContent();
			// hier dann zum bsp. die Seite parsen
		}
		catch(MalformedURLException me) {
			me.printStackTrace();
		}
		catch(IOException ioe) {
			ioe.printStackTrace();
		}
```
wäre schön, aber bei obigen Code bleibt beim Debuggen mit Eclipse ewig auf der Object... Zeile hängen

Gibt es da was ganz einfaches bzw. was ist an obigem Code falsch?

Thx
Fry


----------



## Fry (3. Feb 2007)

hehe, ich glaube die Seite ist zurzeit nicht erreichbar, ich teste noch mal eine andere....


----------



## Fry (3. Feb 2007)

Ok, ich mach Alleinunterhalter 

Nur zu Dokuzwecken, falls es wer braucht, also mit

```
try {
			URL u = new URL("https://www.123.de");
			HttpsURLConnection hp = (HttpsURLConnection)u.openConnection();
			Object object = hp.getContent();
			 BufferedReader br = new BufferedReader(new InputStreamReader( 
	                    (InputStream) object)); 
			 String line;
			 
			 while((line = br.readLine()) != null) {
				 System.out.println(line);
			 }
		}
		catch(MalformedURLException me) {
			me.printStackTrace();
		}
		catch(IOException ioe) {
			ioe.printStackTrace();
		}
	}
```

kann man die HTML Seite auf COnsole ausgeben (man prüfe vorher ob der Server verfügbar ist  :lol: )

Fry


----------



## Christian342 (2. Mrz 2007)

Ich suche etwas ähnliches: und zwar möchte ich das einloggen mit User / pwd auf eine Internetseite (https://) automatisieren und dann verschiedene Seiten aus dem geschützen Bereich anzeigen. Wäre sehr nett, wenn mir jemand ein einfaches Beispiel zeigen könnte.

Problem wurde auch hier beschrieben: http://forum.java.sun.com/thread.jspa?threadID=428563&messageID=1913568 aber nicht gelöst


Als Beispiel könnte man xing.com nehmen, dort muss man sich einloggen und danach merkt sich der Browser wohl normalerweise nutzer / pwd oder irgendein cookie um sich für die folgenden seiten zu authentifizieren.


----------



## Wildcard (2. Mrz 2007)

Nimm den HTTPClient von Apache.


----------



## Christian342 (4. Mrz 2007)

Danke, das ist genau was ich gesucht habe. Ich habe auch das Beispielprogramm unter http://jakarta.apache.org/commons/httpclient/tutorial.html (gnaz unten) zum laufen gebracht.

Allerdings wundere ich mich ein bißchen, warum das Beispiel mit apache.org problemlos läuft aber bei google.de und vielen anderen folgende Warnung kommt:

04.03.2007 18:56:40 org.apache.commons.httpclient.HttpMethodBase getResponseBody
WARNUNG: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

Wäre ja an sich kein Problem und man könnte es über getResponseBodyAsStream einlesen, aber warum der Unterschied bei apache.org und google.de. Als String wäre mir die Seite nämlich angenehmer.


----------



## Wildcard (4. Mrz 2007)

Going to buffer response body of large or unknown size.
Sagt das nicht alles?
Der body ist entweder groß oder von unbekannter Größe.  :wink:


----------



## Christian342 (4. Mrz 2007)

So habe ich das auch gedeutet, aber ich kenne die ganzen Details des HTTP protokolls nicht und wunder mich einfach warum die kurze google.de Seite unbekannt sein soll während apache.org bekannt sein soll.
Vllt hält google nicht alle Konventionen des HTTP-Protocols ein und sendet die Größe nicht mit?

Werde es jetzt immer als Stream einlesen und umwandeln mit:

```
BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));

			String nextline, response;
			response = "";
		      
			while((nextline = br.readLine()) != null) {
				response += nextline;
				response += "\n";
			}
			seite=response;
			
			br.close();
```

Allerdings habe ich das Gefühl, dass es dadurch langsamer wird (habe ein paar Testdurchläufe mit Zeitmessung über System.nanoTime() gemacht).

Mal sehen wie sich das auf die Performance auswirkt. Ich möchte eben alle 5 Minuten möglichst zeitnah rund 100 Seiten aufrufen um Börsenkurse zu speichern....


----------



## Wildcard (4. Mrz 2007)

Deim Problem ist das String + String. Der Java-Performance Killer #1.
Nimm stattdessen einen StringBuilder den du noch vor der Schleife initialisierst.


----------



## Christian342 (4. Mrz 2007)

Vielen Dank! Zur Dokumentation hier die neue Version:

	     BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));

	     	StringBuilder sb = new StringBuilder();
			String nextline=null;

			while((nextline = br.readLine()) != null) {
				sb.append(nextline + "\n");
			}

			seite=sb.toString();

			br.close();


----------



## Wildcard (4. Mrz 2007)

Gleiches Problem :wink:
Mach's so:

```
String nl = "\n";
 while((nextline = br.readLine()) != null) {
sb.append(nextline);
sb.append(nl);
}
```


----------



## Christian342 (5. Mrz 2007)

Gut, jetzt komme ich der Sache schon näher und kann bereits normale Daten von de.finance.yahoo.com und onvista.de abfragen. Allerdings würde ich auch gerne auf mein Depot bei cli*ckopt*ions.de (OHNE *) zugreifen und müsste mich dazu einloggen.

Mit folgendem Programm (in Anlehnung an das Beispiel von apache.org) bekomme ich die Antwortseite, dass mein Browser kein java-Script unterstützt. Das war zu erwarten und deshalb habe ich versucht meinen Opera zu emulieren, in dem ich ein paar Werte setzte. Auf http://www.aarweb.org/other/browserinfo.asp sieht es jetzt im Prinzip gleich aus...trotzdem der Fehler...


```
// package gethttp.httpClient;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;

import java.io.*;

public class Simple {

	 private static String url ="http://www.cli*ckopt*ions.de"; // OHNE * !!!!!!
	 
	 public static void main(String[] args) {

// wir emulieren meinen Opera 
		System.getProperties().setProperty("httpclient.useragent", "Opera/9.02 (Windows NT 5.1; U; en)");

		HttpClient client = new HttpClient();

	    GetMethod method = new GetMethod(url);
	    
// wir emulieren meinen Opera aufgrund der Werte von  [url]http://www.aarweb.org/other/browserinfo.asp[/url]
	    method.setRequestHeader( new Header( "connection", "Keep-Alive" ) );
	    method.setRequestHeader( new Header( "Accept-Language", "de-DE,en;q=0.9,de;q=0.8" ) );
	    method.setRequestHeader( new Header( "Accept-Charset", "iso-8859-1, utf-8, utf-16, *;q=0.1" ) );
	    method.setRequestHeader( new Header( "accept-encoding", "deflate, gzip, x-gzip, identity, *;q=0" ) );
	    method.setRequestHeader( new Header( "Content-Type", "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1" ) );
	    method.setRequestHeader( new Header( "Referer", "http://www.google.com/search?hl=en&newwindow=1&client=opera&rls=en&hs=bov&q=browser+information&btnG=Search" ) );


	    try {
 	      int statusCode = client.executeMethod(method);

	      if (statusCode != HttpStatus.SC_OK) {
	        System.err.println("Method failed: " + method.getStatusLine());
	      }
	     
	      
	      String seite;
	    
	      BufferedReader br = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream()));

	      StringBuilder sb = new StringBuilder();
	      String nextline=null;
	      String nl = "\n";
	      while((nextline = br.readLine()) != null) {
				sb.append(nextline);
				sb.append(nl);
	      }
			
	      seite=sb.toString();
			
	      br.close();


	    
	    
		

	   System.out.println(new String(seite));


	   
	    } catch (HttpException e) {
	      System.err.println("Fatal protocol violation: " + e.getMessage());
	      e.printStackTrace();
	    } catch (IOException e) {
	      System.err.println("Fatal transport error: " + e.getMessage());
	      e.printStackTrace();
	    } finally {
	      method.releaseConnection();
	    }  
	  }
}
```


----------



## Christian342 (5. Mrz 2007)

Das vorherige Problem hat sich gelöst: auf cli*ckop*tions.de ist eine zwischenseite, die auf http://www.clic*kopti*ons.de/web/home.do?lang=fr&country=FR&flash=no weiterleitet.

Jetzt muss ich mich also erst mal um das Session Handling kümmern.


----------

