Jakarta HTTPClient

  • Themenstarter Themenstarter Johannes.L
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

Johannes.L

Gast
Hi,

wie kann ich denn am besten unterscheiden ob es sich bei einer Resource um Binärdaten oder halt String-Literale handelt, also letztendlich bspw. um (X)HTML, CSS oder was auch immer und Bildern? Muss ich da alle Möglichkeiten im Content-Type Header abklappern oder geht das auch besser?

Viele Grüsse,
Johannes
 
Den Content-Type Header musst du schon beachten, aber nicht alle Möglichkeiten abklappern. Der Content-Type besteht ja aus Medientype/Subtype. Nur wenn der Medientype text ist, kannst du mit Strings arbeiten (unabhängig vom Subtype), ansonsten immer nur binär.
 
kleiner_held hat gesagt.:
Den Content-Type Header musst du schon beachten, aber nicht alle Möglichkeiten abklappern. Der Content-Type besteht ja aus Medientype/Subtype. Nur wenn der Medientype text ist, kannst du mit Strings arbeiten (unabhängig vom Subtype), ansonsten immer nur binär.

Danke, irgendwie klappt es leider noch nicht. Ich will den Stream an den Client weiterleiten bzw. mache das Byteweise (soll ein Proxy werden):

Code:
to_client = new PrintWriter(client.getOutputStream(),true);

...

if(getMethod.getResponseHeader("Content-Type").getValue().startsWith("text"))
{
	logger.debug("Content-Type: text");
	to_client.print(getMethod.getResponseBodyAsString());
	to_client.flush();
}
else //if(getMethod.getResponseHeader("Content-Type").getValue().startsWith("image"))
{
	InputStream in = getMethod.getResponseBodyAsStream();
						
	int currentByte;
						
	while((currentByte = in.read()) != -1) 
	{
		to_client.print(currentByte);
		to_client.flush();		
	}
}
 
"Es klappt nicht" ist weder eine Frage noch eine aussagekräftige Fehlermeldung :!:

Abgesehen davon darfst du natürlich beim Senden von binären Daten an den Client nicht in den PrintWriter schreiben, sondern du musst direkt auf dem OutputStream (client.getOutputStream()) arbeiten (outputStream.write(...)).
Ansonsten ist es auch schneller wenn Du nicht jedes Byte einzeln liest und schreibst, sondern einen byte Array als Puffer verwendest.
 
kleiner_held hat gesagt.:
"Es klappt nicht" ist weder eine Frage noch eine aussagekräftige Fehlermeldung :!:

Abgesehen davon darfst du natürlich beim Senden von binären Daten an den Client nicht in den PrintWriter schreiben, sondern du musst direkt auf dem OutputStream (client.getOutputStream()) arbeiten (outputStream.write(...)).
Ansonsten ist es auch schneller wenn Du nicht jedes Byte einzeln liest und schreibst, sondern einen byte Array als Puffer verwendest.

Ah danke, jetzt ist lediglich noch die Zeichenkodierung ab und zu falsch. Laut <http://jakarta.apache.org/commons/httpclient/charencodings.html> sollte die getResponseBodyAsString()-Methode die richtige Kodierung aus dem Content-Type Header holen, falls vorhanden. Komisch, dass das im Falle von bspw. dict.leo.org nicht klappt:
Code:
johannes@antares:~> telnet dict.leo.org 80
Trying 83.220.155.8...
Connected to dict.leo.org.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.0 200 OK
Server: PAWS ElB-1.43
Content-Type: text/html; charset=ISO-8859-15
Date: Sun, 6 May 2007 21:21:47 GMT
Content-Length: 33524

Connection closed by foreign host.
Da werden die Umlaute nicht richtig angezeigt, das gleiche bei bspw. iks-jena.de, wobei da per Default iso-8859-1 genutzt werden sollte.
 
Um das richtige Encoding zu verwenden musst du deinen PrintWriter so initialisieren:
Code:
String encoding = "ISO-8859-15"; // hier das Encoding aus dem ResponseHeader extrahieren
to_client = new PrintWriter(new OutputStreamWriter(new client.getOutputStream(), encoding),true);
Denn da du (nehme ich mal an) dem client dann auch den Encoding ResponseHeader weiterreichts, muss natuerlich auch dein OutputStream entsprechend codierte Strings enthalten.
Wenn du uebrigens nur einen Proxy bauen willst und dich der Inhalt einer "text/*" Response garnicht interessiert, kannst Du auch in diesem Fall einfach die Binaerdaten durchreichen, also Dir die Unterscheidung in Text- und Binaerdaten komplett sparen.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben