Jakarta HTTPClient

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
 

kleiner_held

Top Contributor
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.
 

Johannes L.

Aktives Mitglied
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();		
	}
}
 

kleiner_held

Top Contributor
"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.
 

Johannes L.

Aktives Mitglied
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.
 

kleiner_held

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
K Bad Request nach Form Login in Jakarta HttpClient Netzwerkprogrammierung 4
P jakarta.HttpClient: Port bei GetMethod angeben Netzwerkprogrammierung 3
hoangvm Jakarta Commonnet vs Java URL Netzwerkprogrammierung 5
S Verzeichnis auslesen (FTP Jakarta Commons Net) Netzwerkprogrammierung 2
G Jakarta Net Commons - FTPClient: Problem bei Dateiupload Netzwerkprogrammierung 2
D HTTP Apache-HttpClient/UNAVAILABLE (java 1.4) Netzwerkprogrammierung 18
B HttpClient - Server (Jetty) - getInputStream - EOF Netzwerkprogrammierung 3
G apache httpClient Problem. Netzwerkprogrammierung 5
B HttpClient Netzwerkprogrammierung 2
M Apache HTTPClient Server log ausgeben ?! Netzwerkprogrammierung 3
N HTTP Apache 4.2.1 HttpClient 302 nach Login und auf den weiteren Seiten. Netzwerkprogrammierung 5
R Apache HttpClient File Download? Netzwerkprogrammierung 3
M HTTP HTTPClient Authentication - Quickr Server Netzwerkprogrammierung 8
H Java 1.4 HTTPClient Content von PutMethod Netzwerkprogrammierung 4
M need org.apache.commons.httpclient.* Netzwerkprogrammierung 8
K Login via apache httpclient Netzwerkprogrammierung 4
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
M Dateiupload mittels HttpClient Netzwerkprogrammierung 3
F FileUpload mit commons HttpClient Netzwerkprogrammierung 17
T HTTP Apache Commons HttpClient Bibliothek Netzwerkprogrammierung 2
H HTTP Login mit POSTMethod und httpClient Netzwerkprogrammierung 5
lordcarlos HTTP Apache HttpClient, post und login. Netzwerkprogrammierung 2
B HTTP Probleme mit HttpClient? Netzwerkprogrammierung 2
H Bilder mit HttpClient hochladen Netzwerkprogrammierung 3
T Apache HttpClient & Default Headers Netzwerkprogrammierung 9
T apache HTTPClient einloggen Netzwerkprogrammierung 2
T HttpClient - Senden via Post Netzwerkprogrammierung 12
M httpclient kann sich nicht auf asp.net Seite anmelden Netzwerkprogrammierung 2
Q HTTPS mit Apache HttpClient Netzwerkprogrammierung 4
M Seltsame Fehlermeldung (httpclient) Netzwerkprogrammierung 6
E HttpClient und return Problem Netzwerkprogrammierung 6
D Problem beim holen einer PHP-Seite via HttpClient Netzwerkprogrammierung 19
C HTTPS mit Apache HTTPClient Netzwerkprogrammierung 1
M org.apache.commons.httpclient.HttpClient Netzwerkprogrammierung 3
S mit HttpClient Seiteninhalt lesen Netzwerkprogrammierung 8

Ähnliche Java Themen

Neue Themen


Oben