HTTP Apache HttpComponents und GZIP

Würfelzucker

Neues Mitglied
Hallo Community,

ich habe ein Problem beim Umgang mit einem GZIP und den Apache HttpComponents. Ich habe (vermutlich?) GZIP-Komprimierten Messagebody. Ich bin nicht besonders erfahren mit Java, daher fällt mir die Fehleranalyse schwer.

Hier ein Ausschnit meines Codes
Java:
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();

// habe den gesamten Header übernommen, den Firefox auch sendet..
request.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
request.setHeader("Accept-Encoding", "gzip, deflate")
// usw...

try {
request.setURI(new URI(meineSeiteAlsString));
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();

System.out.println(EntityUtils.getContentMimeType(entity)); // gibt text/html
System.out.println(EntityUtils.getContentCharSet(entity)); // gibt null
// System.out.println(EntityUtils.toByteArray(entity) + "\n\n");
System.out.println(EntityUtils.toString(entity)); // Ausgabe in einem Bild folgt

} catch (Exception e) {
    	 System.out.println("ERROR: " + e.toString());
} finally {
    	 client.getConnectionManager().shutdown();
}

Die Antwort vom Server:
Code:
HTTP/1.1 200 OK
Date: Tue, 28 Feb 2012 22:18:55 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.14
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 154
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
Als Messagebody erwarte ich einen String mit Zahlen und Sonderzeichen. Stattdessen erscheint folgendes (lies sich nicht anständig kopieren, daher als Bild):
D6UOU.png


Es scheint eine Möglichkeit zu geben den Messagebody per
Code:
EntityUtils.toByteArray(entity)
und
Code:
java.util.zip
. Leider haben alle meine bisherigen Versuche zu einer
Code:
java.io.IOException: Stream closed
-Exception geführt. Deshalb folgende Fragen:

1. Woher weiß ich, ob der MessageBody den ich als gzip-komprimiert vermute, auch wirklich gzip-komprimiert ist? Kann ich mich da auf das
Code:
Content-Encoding: gzip
des Servers verlassen?
2. Kann ich mit
Code:
EntityUtils.toByteArray(entity)
weiterarbeiten oder ist damit der Inhalt bereits verfälscht?
3. Kann mir jemand bitte ein Beispiel zeigen, wie ich aus dem ByteArray einen dekomprimierten String erhalte? Alle meine Versuche hatten leider keinen Erfolg 🙁

Ich bitte um Hilfe. Vielen Dank im Voraus 🙂

Schönen Gruß
Würfelzucker
 
Wie hast du es denn probiert? Ohne es auszuprobieren sollte es so lesbar sein:

Java:
HttpEntity entity = response.getEntity();
GZIPInputStream gzipStream = new GZIPInputStream(entity.getContent());

den gzipStream kannst du dann ganz normal lesen. Falls es ein String sein sollte geht das ungefähr so (dirty):

Java:
InputStreamReader reader = new InputStreamReader(zipStream);
BufferedReader buffered = new BufferedReader(reader);

StringBuilder builder = new StringBuilder();
String line = null;

while((line=buffered.readLine())!=null){
    builder.append(line);
}

String contentAsString = builder.toString();
 

Zurück
Oben