# HTML Code von Website abrufen



## darman96 (11. Nov 2014)

Hallo,

ich muss für eine App die ich im moment programmiere den HTML Code einer website abrufen.
Dafür hab ich den Code hier gefunden:


```
HttpClient http = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = http.execute(httpget);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
StringBuilder builder = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null) {
	builder.append(line);
}

sourceCode = builder.toString();
stream.close();
```

Die App schmiert aber leider immer beim ausführen von httpget ab.
hat jemand ne idee was der fehler ist?


----------



## JavaMeister (11. Nov 2014)

> hat jemand ne idee was der fehler ist?



Könnte alles mögliche sein.


----------



## darman96 (11. Nov 2014)

was denn zum Beispiel?


----------



## JavaMeister (11. Nov 2014)

Die Seite könnte down sein und damit über das Netzwerk nicht erreichbar.


----------



## darman96 (11. Nov 2014)

nope ich habs mit google versucht
und ich hab auch die INTERNET permission bei android gesetzt


----------



## JavaMeister (11. Nov 2014)

Wie man Fragen richtig stellt


----------



## darman96 (11. Nov 2014)

mehr kann ich zu dem Problem nicht sagen...


----------



## Flown (12. Nov 2014)

http.execute(...) wirft dir eine Exception. Fang die mal ab und lass sie dir ausgeben und poste mal.


----------



## darman96 (12. Nov 2014)

Öhm wie geb ich die aus?


----------



## Joose (13. Nov 2014)

darman96 hat gesagt.:


> Öhm wie geb ich die aus?



Bitte etwas Eigeninitiative zeigen! 
Java bietet dir ein Exception Handling an mit try/catch (Keywörter die dir bei der Suche helfen werden), wo du die Meldung dann ausgibst bleibt dir überlassen

Datei (XML, Text, ...)
Datenbank
Konsole
....


----------



## darman96 (14. Nov 2014)

Das Problem ist soweit kommt das Programm gar nicht erst
ich hab um den ganzen block ein Try/Catch aber wenn ich im Catch part was ausgeben will kommt der gar nicht erst da hin.


```
try {
        	HttpClient client = new DefaultHttpClient();
        	HttpGet get = new HttpGet("http://www.google.de");
        	HttpResponse response = client.execute(get);		
        	HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            StringBuilder builder = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null ) {
            	builder.append(line);
            }
            sourceCode = builder.toString();
        } catch (ClientProtocolException e) {
			e.printStackTrace();
			Log.e("ERROR", e.getMessage());
		} catch (IOException e) {
			e.printStackTrace();
			Log.e("ERROR", e.getMessage());
		}
```


----------



## Joose (14. Nov 2014)

Füge einen allgemeinen catch Block hinzu (fange alle anderen Exceptions).
Entweder läuft dein Code durch und tut aber nicht dass was du willst oder es fliegt eine Exception die nicht gefangen wird von deinem try/catch.
Der catch Part wird auch erst ausgeführt wenn wirklich eine Exception geflogen ist.


----------



## JavaMeister (14. Nov 2014)

Oder der Code wird garnicht aufgerufen. Man weiß es einfach nicht, da wir weniger als Zero Informationen haben.


----------



## darman96 (15. Nov 2014)

also es ist so wenn ich die App debugge und am Anfang des Try blocks einen Breakpoint setzte kommt der erst mal bis zu dem punkt und dann bin ich mit Step Over weiter gesprungen. Damit komme ich bis hier : 
	
	
	
	





```
HttpResponse response = client.execute(get);
```
. Wenn ich dann nochmal weisterspringe geht der irgendwo rein und da steht nur noch Source not found. das macht der dann drei vier schritte nochmal und dann schmiert die app komplett ab.


----------



## dzim (17. Nov 2014)

An dieser Stelle solltest du schon (in der Debug-Ansicht) die Exception sehen. Ansonsten einfach ein 
*try {...} catch(Exception e) { Log.e("TEST", e.getMessage(), e); }*
um das #execute herum.

Egal ob dieser brachiale try-catch-Block oder ordentliches Debuggen: Eigentlich solltest du nach der Zeit den Grund für deine Exception schon gefunden haben...

Hier ein leicht angepasstes Beispiel aus meinen Code - der auch funzt.

```
public static boolean uploadResult(String request, String xml, String referenceServer, int port, String cgiPath, String uploadTarget, String mobileIp) {
		
		HttpParams httpParameters = new BasicHttpParams();
		HttpConnectionParams.setConnectionTimeout(httpParameters, 10000);
		HttpConnectionParams.setSoTimeout(httpParameters, 15000);

		HttpClient httpClient = new DefaultHttpClient(httpParameters);
		HttpPost postRequest = new HttpPost(request);

		try {
			postRequest.setHeader("Content-Type", "application/xml");
			postRequest.setEntity(new StringEntity(xml));
		} catch (UnsupportedEncodingException ue) {
			android.util.Log.e(Utils.class.getSimpleName() + ":uploadResult", "UnsupportedEncodingException while processing XML", ue);
			return false;
		} catch (Exception ue) {
			android.util.Log.e(Utils.class.getSimpleName() + ":uploadResult", "Other Exception while processing XML", ue);
			return false;
		}
		
		android.util.Log.d(Utils.class.getSimpleName() + ":uploadResult", "PostRequestLine :" + postRequest.getRequestLine());
		
		HttpResponse response = null;
		BufferedReader in = null;
		try {
			response = httpClient.execute(postRequest);
			in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 4096);
			String line = "";
			while ((line = in.readLine) != null) {
				// do something?
				android.util.Log.d(Utils.class.getSimpleName() + ":uploadResult", line);
			}
			return true;
		} catch (Exception ex) {
			android.util.Log.e(Utils.class.getSimpleName() + ":uploadResult", "Exception while sending results", ex2);
			return false;
		} finally {
			httpClient.getConnectionManager().shutdown();
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {}
			}
		}
	}
```


----------



## darman96 (17. Nov 2014)

So hab jetzt mal deinen Code ausprobiert, hab aber den teil mit der xml variable weggelassen weil ich nicht weiß was da rein soll.

Hier der neue Code:

```
private void getSourceCode() {
    	
    	HttpParams httpParameters = new BasicHttpParams();
    	HttpConnectionParams.setConnectionTimeout(httpParameters, 10000);
    	HttpConnectionParams.setSoTimeout(httpParameters, 15000);
    	 
    	HttpClient httpClient = new DefaultHttpClient(httpParameters);
    	HttpPost postRequest = new HttpPost("http://www.google.de");
    	HttpResponse response = null;
    	BufferedReader in = null;
    	try {
    		response = httpClient.execute(postRequest);
    		in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 4096);
    		String line = "";
    		while ((line = in.readLine()) != null) {
    			// do something?
    		}
    		return;
    	} catch (Exception ex) {
    		Log.e("ERROR", ex.getMessage());
    		return;
    	} finally {
    		httpClient.getConnectionManager().shutdown();
    		if (in != null) {
    			try {
    				in.close();
    			} catch (IOException e) {}
    		}
    	}
    	
    }
```

und hier was LogCat mir auswirft.

Anhang anzeigen 7113


----------



## Flown (18. Nov 2014)

Anhang ist ungültig!


----------



## darman96 (18. Nov 2014)

oh gestern hats noch funktioniert.

dann halt so: https://www.dropbox.com/s/bqnihf6xvfq8oae/exception.PNG?dl=0


----------



## Flown (18. Nov 2014)

Ahja du bist stolzer Besitzer einer NullPointerException -> steht doch alles im Stacktrace!


----------



## darman96 (18. Nov 2014)

ich verstehs nicht wo soll denn da der nullpointer sein?


----------



## darman96 (19. Nov 2014)

also ich werd aus der exception nicht schlau.
wo in meinem Code soll der Nullpointer denn sein?


----------



## Flown (19. Nov 2014)

Also ich hab mir deinen Stacktrace nocheinmal angesehen und es hat ca. 0.2 sek gedauert bis ich auf sowas gestoßen bin: Android println needs a message


----------



## darman96 (19. Nov 2014)

okay jetzt bekomm ich ne NetworkingOnMainThread Exception...
Warum muss ich nen extra Thread aufmachen um was im Netzwerk zu machen?


----------



## dzim (19. Nov 2014)

NetworkingOnMainThreadException ist eigentlich selbstsprechend: Mache Netzwerkoperationen (Sockets oder UrlConnection oder eben Apache HttpClient / OkHttp) nicht auf dem Hauptthread.
Mach es in Services, AsyncTasks oder einfach eben anderen Threads.


----------



## darman96 (21. Nov 2014)

Ich hab das jetzt mit Async Task gemacht jetzt klappts.


----------



## dzim (21. Nov 2014)

Ach so, zu deiner Frage: Android forciert das mit dem Netzwerk, damit deine UI nicht blockiert. So haut dir die Umgebung gleich auf die Finger, wenn du etwas programmierst, dass das (evtl.) macht. Savvy?


----------



## darman96 (21. Nov 2014)

achso ja das macht irgendwie sinn


----------

