PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [JAVA] POST versenden um Download zu starten...


#44
2008-01-19, 19:38:57
Jaa und da wäre dann mein Problem. Den Code fürs POST hab ich mir schon aus dem Web besorgt (da keine Ahnung davon; hab nur die Seite eingetragen und die sache mit der SID), aber warum bekomme ich da keine Response zurück? Wo landet die sonst? Les ich das Falsche? Geht das so überhaupt, oder sollte ich mit Sockets arbeiten?

Comments in Deutsch hab ich verbrochen.

public class WeWantDownloads {

@Test public void testHomePage() throws Exception {
final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2);
final HtmlPage page = (HtmlPage) webClient.getPage("http://www.zielseite.de/show/1234/[downloadname]/");
// Auf einem Form auf dieser page ist ein Downloadbutton (input type=submit)
// der die versteckte SID (auf der Form als hidden input) posted/soll wohl dl-manager abhalten...
// Das gilt es zu umgehen ;)

HtmlForm frm = (HtmlForm) page.getForms().get(0);

try {
// Construct data
String data = URLEncoder.encode("sid", "UTF-8") + "=" + URLEncoder.encode(frm.getInputByName("sid").getValueAttribute(), "UTF-8");

// Send data
URL url = new URL("http://www.zielseite.de/down.php?dl=4013");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();

// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
int i = 0;
while (line = rd.readLine() != null) {
System.out.println(i++ + line);
}
} catch (Exception e) {
}
}
}


Das ganze Läuft mit htmlUnit (das kann leider keine downloads testen; die ersten 3 zeilen + das suchen der sid wird damit erledigt) das sich auf JUnit stützt (ist schön einfach die SID zu bekommen, will später noch mehr seitenteile auslesen).

Sephiroth
2008-01-19, 22:01:53
Vielleicht solltest du die Exception nicht einfach verschlucken, sondern in dem Falle (um Testen) mal was ausgeben? ;)

e.printStackTrace();

Nachtrag: du schließt den OutputStream nicht. statt wr.flush() solltest du wr.close() nehmen. Den InputStream dann am Ende auch nicht, aber das ändert ja an der Ausgabe nichts.

#44
2008-01-19, 22:14:57
Vielleicht solltest du die Exception nicht einfach verschlucken, sondern in dem Falle (um Testen) mal was ausgeben? ;)

e.printStackTrace();

Der Programmablauf ist 100%ig. Da gibt es keinen Output...

Es kommt einfach auf dem geöffneten Stream nix rein.

Momentan versuche ich htmlUnit so umzubauen das es mir nicht versucht Dateien nach HtmlPage zu casten sondern lieb fragt ob ich das nicht speichern mag... Ob das im Sinne des Erfinders war? :upara:


Nachtrag: du schließt den OutputStream nicht. statt wr.flush() solltest du wr.close() nehmen.


€: Ehw ja das war vorher schon da. Habs entfernt weil ich mit while(true) gearbeitet hab um zu sehen ob ausschließlich null rein kommt. Das war dann unreachable, habs vergessen wieder hinzupacken.

Sephiroth
2008-01-19, 22:20:06
Reading from and Writing to a URLConnection (The Java™ Tutorials > Custom Networking > Working with URLs) (http://java.sun.com/docs/books/tutorial/networking/urls/readingWriting.html)
1. Create a URL.
2. Retrieve the URLConnection object.
3. Set output capability on the URLConnection.
4. Open a connection to the resource.
5. Get an output stream from the connection.
6. Write to the output stream.
7. Close the output stream.

Der Programmablauf ist 100%ig. Da gibt es keinen Output...
achso, ich dachte das meintest du mit no response :<

#44
2008-01-19, 22:43:27
achso, ich dachte das meintest du mit no response :<

Nein, ich meine das der HTTP-Response nicht so wie erwartet über den InputStream kommt (nach dem POST über den OutputStream), was dieser Beispiel-Code ja vorgaukelt.

€: Ich hab jetzt htmlUnit soweit umgebogen das es Dateien Downloaden kann. :) Ist aber noch (sowas von) Unsauber.

HellHorse
2008-01-20, 01:13:21
URLConnection ist recht scheisse. Im Allgemeinen ist Commons HttpClient (http://hc.apache.org/httpclient-3.x/index.html) vorzuziehen. Die haben auch Doku, Beispiele und so weiter.