PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] URLConnection Parameter


EinGast
2008-11-03, 14:29:18
hi,

also ich weiß das folgende frage auf anhieb recht blöd und sinn frei erscheinen mag.
allerdings versuche ich gerade einen clienten zu "emulieren" bzw. nachzubauen der in python geschrieben ist. und das ganze geschieht in einer java opensource application die auf die klassen urlconnection bzw. httpurlconnection setzt. ich will also das exakt selbe verhalten erzielen und dafür das vorhandene java programm entsprechend anpassen.

das problem ist, dass die httpurlconnection immer per default den host und accept parameter (ans ende) setzt:
userset param1: qwe
userset param2: asd
[...]
Host: xxx
Accept: text/html, image/gif, image/jpeg, *; q=.2, ; q=.2

der request des python clienten ist allerdings folgendermaßen aufgebaut:
Host: xxx
userset param1: qwe
userset param2: asd
[...]

ich will also bei meiner connection den host parameter an den anfang setzen und den accept parameter ganz entfernen.
vorschläge? ;-)

die api sieht leider so ein verhalten nicht vor, da es dem server egal sein sollte welche reihenfolge die parameter haben bzw. wird er diejenigen ignorieren die er nicht braucht... ist zwar logisch, aber bei meinem vorhaben nicht gerade vorteilhaft :/


mfg

Gast
2008-11-03, 21:47:51
Wie du bereits geschrieben hast, ist es einem Server egal ob unnötige Parameter dabei sind oder welche Folge sie haben.
Deshalb existiert eine entsprechende implementierung auch nicht. Wozu auch, 99,99% würden nicht auf die Idee kommen einen starren Request zu senden.

Das hilft aber deinem Problem natürlich nicht weiter, d.h. du musst dir eine Lösung suchen, denn mit der URLConnection Klasse wirst du nicht weiter kommen.

Ich bin da nicht besonders bewandert auf diesem gebiet, deshalb gebe ich einfach mal an den nächsten Leser ab :p

noch_en_Gast_in_der_Runde
2008-11-04, 15:06:31
schau mal nach HTTPClient von jakarta

oder was anderes, um deinen pfusch vollständig zu machen, schnapp dir die java source und schreib sie selbst um... das könnte sich allerdings als schwieriger erweisen als du glauben würdest!

Berni
2008-11-04, 18:43:15
Da holst dur dir die Source von java.net.HttpURLConnection (ist im JDK dabei oder auch im OpenJDK, dort ist es vermutlich dann unter GPL-Lizenz falls du das brauchst) und änderst das halt ab. Oder du extendest die HttpURLConnection. Wenn du freakig bist kannst s auch mit ner TCP-Connection selber machen. So komplex ist HTTP ja eh nicht.

ghostfucker
2008-11-04, 20:18:36
Oo

apache client? java source bearbeiten?

also sry, aber da solltet ihr noch etwas java lernen.
in so einem fall nimmt man gefälligst nen socket und schiebt das raus was man will, so ist es dann wenigstens korrekt gelöst.

Berni
2008-11-04, 20:27:25
Wieso sollte man die Java-Source-Klassen nicht nehmen und abändern (natürlich dann unter neuem Namen bzw. halt mit Vererbung und die entsprechende Methode überschreiben)? Das sind ganz normale Java-Klassen und wieso sollte man was neu erfinden wenn nur eine kleine Änderung nötig ist?

ghostfucker
2008-11-04, 20:42:24
unnötiger aufwand...

kurz ändern ist da nicht, da die klassen abstract sind. da müssen einige methoden überschrieben werden.

mit nem socket ist das ne sache von 2min. da wie hier bereits ne fertige urlconnection abhandlung implementiert ist, sind das etwa 5 zeilen die geschrieben werden müssen...

EinGast
2008-11-05, 09:56:11
mit sockets klappts super :)

bis auf einige kleinigkeiten, für die ich wohl einfach zu nooblike bin...
was mache ich, wenn der server z.b. mit gzip antwortet?

im moment sieht das so aus, wie kann man das mit sockets überprüfen?

HttpURLConnection con = (HttpURLConnection) reqUrl.openConnection();
con.addRequestProperty("Accept-Encoding","gzip");

[...]

InputStream is = con.getInputStream();
String encoding = con.getHeaderField("content-encoding");
boolean gzip = encoding != null && encoding.equalsIgnoreCase("gzip");

if ( gzip )
is = new GZIPInputStream( is );

EinGast
2008-11-05, 15:29:48
ich nochmal, also dieses problem lässt sich nur dadurch lösen, dass ich zuerst den header einlese, dann auswerte und anschließen wenn nötig zu dem gzipstream wechsle...

das ist aber schon in dem HttpURLConnection "baum" implementiert.
das problem ist, das eben HttpURLConnection abstrakt ist und die eigentliche implementierung in sun.net.www.protocol.http.HttpURLConnection steckt.


so nun die heilige frage, woher bekomme ich die source aus dem sun.* package? (ist nicht in der src.zip dabei :/)

Berni
2008-11-05, 17:16:01
OpenJDK ist das Zauberwort wie ich bereits erwähnte: http://download.java.net/openjdk/jdk6/ bzw. http://download.java.net/openjdk/jdk7/ Da ist die Datei definitiv drin unter openjdk\jdk\src\share\classes\sun\net\www\protocol\http. Ist unter GPL und somit frei verwendbar.

Gast
2008-11-06, 10:13:52
thx!
funktioniert nun wie ich es wollte :)
waren nur 3 zeilen die ich auskommentieren musste...