Übergabe von post request Parametern

Hallo

ich habe mir ein kleines Java-Programm zur Verwaltung meiner Bücher geschrieben. Dieses soll nun um eine Methode zur Ermittlung des aktuellen Buchpreises erweitert werden. Hierzu soll anhand der ISBN eine Abfrage von werzahltmehr.de oder buchankauf24.de gestellt werden.

Leider komme ich dabei aber nicht mehr weiter. Der erste Versuch mit HTMLunit ist gescheitert und auch die Übergabe von PostRequest-Parametern funktioniert nicht.

Java:
        try {
          // Parameter
          String parms = 
          // Test-ISBN 3827244390 (Jetzt lerne ich Java 7)
          URLEncoder.encode("ctl00$Main$txtSearch", "UTF-8") + "=" + URLEncoder.encode("3827244390", "UTF-8");
          parms += "&" + URLEncoder.encode("ctl00$Main$btnSearch", "UTF-8") + "=" + URLEncoder.encode("Preis ermitteln", "UTF-8");
          
          // Abfrage
          URL url = new URL("http://www.buchankauf24.de/default.aspx");
          URLConnection connection = url.openConnection();
          connection.setDoOutput(true);
          OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
          wr.write(parms);
          wr.flush();
   
          // Antwort
          BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
          String line;
          while ((line = rd.readLine()) != null) {
              System.out.println(line);
          }
          wr.close();
          rd.close();
      }

Muss ich die input type="hidden" auch berücksichtigen (siehe Quelltext der Seite)?
Danke für alle Hinweise.
 

Scarabol

Mitglied
Was bekommst du mit dem Code oben denn als Antwort?

Vielleicht postest du noch kurz das Formular das du "hacken" willst.

Ob du die hidden Felder beachten musst, sagt dir dann die Antwort der Webseite. (gewünschte Antwort oder halt nicht) Grundsätzlich würde ich die hidden Felder aber mitsenden...

Gruß
Scarabol
 
Ich bekomme als Rückgabe den Quelltext der Startseite - aber leider ohne den Ankaufpreis für das exemplarisch gewählte Buch. Er scheint die übergebene ISBN (3827244390) zu ignorieren. Wenn ich sie direkt im Browser eingebe, gibt die Seite mir den Ankaufpreis aus.

Das Formular sieht so aus:
<input name="ctl00$Main$txtSearch" type="text" maxlength="32" onchange="javascript:setTimeout('__doPostBack(\'ctl00$Main$txtSearch\',\'\')', 0)" onkeypress="if (WebForm_TextBoxKeyHandler(event) == false) return false;" id="ctl00_Main_txtSearch" tabindex="1" /></td><td align="left" valign="middle" style="width:55%;"><input type="submit" name="ctl00$Main$btnSearch" value="Preis ermitteln" id="ctl00_Main_btnSearch" tabindex="2" class="button" />

Allerdings werden im Quelltext noch weitere inputs vom type='hidden' angezeigt.
 
Danke für die schnelle Antwort!

doPostBack habe ich noch nicht verwendet, ich schaue es mir mal an.

Ob dort ajax verwendet wird weiß ich nicht, ich kann mir leider auch nur den Quelltext der Seite im Browser ansehen und anhand dieser Informationen versuchen, den Aufruf aus Java umzusetzen.
 

Helgon

Bekanntes Mitglied
Ich hab mir selbst son Programm vor paar Monaten geschrieben, liest ISBN, ASIN und auch teilweise Artikel Namen xD

Dazu parse ich Amazon aus. Ich musste auch viel drum herum basteln, weil viel über AJAX geladen wird und man das dementsprechend so gut wie gar nicht mit Java auslesen kann.

Wenn Interesse besteht kann ich dir die Jar schicken
 
Hallo Helgon,

danke für das Angebot!
Den ersten Teil, also das Auslesen der Quelldaten inkl. Parsen der ISBN, EAN etc. habe ich fertig umgesetzt. Mir fehlt nur noch die Übergabe der ISBN an eine Ankaufsplattform und die Übernahme des Ankaufpreises in meine Anwendung. Hast du konkret auch diesen Teil realisiert?

Danke!
 
Ich bin nun ein Stück weiter gekommen, die hidden-fields müssen natürlich berücksichtigt werden. Insbesondere __VIEWSTATE und __EVENTVALIDATION (ASP.NET) müssen zur Laufzeit ermittelt werden.

Nun endet allerdings meine Verarbeitung beim Parametrisieren der Connection, die Zeile
Code:
 conn.setRequestMethod("POST");
wird nicht mehr ausgeführt. Der zuvor ermittelte Response Code der Connection ist jedoch "200" und die Message "OK". Was stimmt an der Stelle nicht?

Ausgabe des Programms (keine Fehlermeldung):
conn.getResponseCode(): 200
conn.getResponseMessage(): OK

Hier der Code:

Java:
        try {
          String page = "http://www.buchankauf24.de/default.aspx";
          String isbn = "3827244390"; // Beispiel-ISBN
          
          URL url = new URL(page);
          HttpURLConnection conn = null;
          conn = (HttpURLConnection) url.openConnection();
          
          DataInputStream in = new DataInputStream(conn.getInputStream());
          BufferedReader d = new BufferedReader(new InputStreamReader(in, "iso-8859-15"));
          String content = "";
          while(d.ready())
          {
            content += d.readLine();
          }
          
          String viewState = null;
          String eventValidation = null;
          Pattern viewStatePattern = Pattern.compile("(?<=__VIEWSTATE\" value=\")(?<val>.*?)(?=\")");
          Pattern eventValidationPattern = Pattern.compile("(?<=__EVENTVALIDATION\" value=\")(?<val>.*?)(?=\")");
          Matcher viewStateMatcher = viewStatePattern.matcher(content);
          if (viewStateMatcher.find()) {
            viewState = viewStateMatcher.group(1);
            
          }
          Matcher eventValidationMatcher = eventValidationPattern.matcher(content);
          if (eventValidationMatcher.find()) {
            eventValidation = eventValidationMatcher.group(1);
          }
          
          // Connection neu oeffnen
          conn = (HttpURLConnection) url.openConnection();
          System.out.println("conn.getResponseCode(): "+conn.getResponseCode());
          System.out.println("conn.getResponseMessage(): "+conn.getResponseMessage()); 
          conn.setRequestMethod("POST");
          conn.setDoOutput(true);
          conn.setDoInput(true);
          conn.setUseCaches(false);
          conn.setAllowUserInteraction(false);
          
          System.out.println("Diese Stelle wird nicht mehr erreicht!");
          
          String postValues = URLEncoder.encode("ctl00$Main$txtSearch", "UTF-8") + "=" + URLEncoder.encode(isbn, "UTF-8");
          postValues += "&" + URLEncoder.encode("ctl00$Main$btnSearch", "UTF-8") + "=" + URLEncoder.encode("Preis ermitteln", "UTF-8");
          
          postValues += "&" + URLEncoder.encode("__LASTFOCUS", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
          postValues += "&" + URLEncoder.encode("__EVENTTARGET", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
          postValues += "&" + URLEncoder.encode("__EVENTARGUMENT", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
          
          postValues += "&" + URLEncoder.encode("__VIEWSTATE", "UTF-8") + "=" + URLEncoder.encode(viewState, "UTF-8");
          postValues += "&" + URLEncoder.encode("__EVENTVALIDATION", "UTF-8") + "=" + URLEncoder.encode(eventValidation, "UTF-8");
          
          DataOutputStream out = new DataOutputStream(conn.getOutputStream());
          
          out.writeBytes(postValues);
          out.flush();
          out.close();
     
          BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
          String line;
          while ((line = rd.readLine()) != null) {
              System.out.println("LINE CONTENT: " +line);
          }
          rd.close();
      }

Danke für weitere Hinweise!
 
Soo, letzter Versuch...

Nun läuft der Code zwar wieder durch, aber die Werte für __VIEWSTATE und __EVENTVALIDATION unterscheiden sich zwischen dem 1. Lesen (Auslesen der Werte für diese Variablen) und dem Setzen der POST-Parameter + Auslesen der Antwort. Kann mir jemand sagen warum ich die ermittelten Werte beim POST request falsch übergebe? Danke!

Java:
        try {
          String page = "http://www.buchankauf24.de/default.aspx";
          String isbn = "3827244390"; // Beispiel-ISBN
          String key = "";
          String viewstate = "";
          String eventvalidation = "";
          String postValues;
          URL url = new URL(page);
          HttpURLConnection connection = null;
          
          connection = (HttpURLConnection) url.openConnection();
          
          // set all required HTTP headers
          connection.setDoOutput(true);
          connection.setDoInput(true);
          connection.setUseCaches(false);
          connection.setRequestMethod("GET");
          connection.setInstanceFollowRedirects(false);
          connection.setRequestProperty("Content-type", "application/text");
          //connection.setRequestProperty("Content-Length", "0");
          
          Pattern viewStatePattern = Pattern.compile("(?<=__VIEWSTATE\" value=\")(?<val>.*?)(?=\")");
          Pattern eventValidationPattern = Pattern.compile("(?<=__EVENTVALIDATION\" value=\")(?<val>.*?)(?=\")");
          
          if (connection != null) {
            for (int i = 1; (key = connection.getHeaderFieldKey(i)) != null; i++) {
						  System.out.println(connection.getHeaderFieldKey(i)
						    + ": " + connection.getHeaderField(key));
            }
            
            StringBuffer sb = new StringBuffer();
            BufferedReader reader = new BufferedReader(
              new InputStreamReader(connection.getInputStream()));
              
            String line;
            
            for (int line_num = 1; (line = reader.readLine()) != null; line_num++) {
              Matcher viewStateMatcher = viewStatePattern.matcher(line);
              if (viewStateMatcher.find()) {
                viewstate = viewStateMatcher.group(1);
                System.out.println("VIEWSTATE: "+viewstate);
              }
              Matcher eventValidationMatcher = eventValidationPattern.matcher(line);
              if (eventValidationMatcher.find()) {
                eventvalidation = eventValidationMatcher.group(1);
                System.out.println("EVENTVALIDATION: "+eventvalidation);
              }
            }
          }
          
          // get the data feed
          connection = (HttpURLConnection) url.openConnection();
          
          // set all required HTTP headers
          connection.setDoOutput(true);
          connection.setDoInput(true);
          connection.setUseCaches(false);
          connection.setRequestMethod("POST");
          connection.setInstanceFollowRedirects(false);
          connection.setRequestProperty("Content-type","application/text");
          //connection.setRequestProperty("Content-Length", "0");
          
          postValues = URLEncoder.encode("ctl00$Main$txtSearch", "UTF-8") + "=" + URLEncoder.encode(isbn, "UTF-8");
          postValues += "&" + URLEncoder.encode("ctl00$Main$btnSearch", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
          
          postValues += "&" + URLEncoder.encode("__LASTFOCUS", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
          postValues += "&" + URLEncoder.encode("__EVENTTARGET", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
          postValues += "&" + URLEncoder.encode("__EVENTARGUMENT", "UTF-8") + "=" + URLEncoder.encode("", "UTF-8");
          
          postValues += "&" + URLEncoder.encode("__VIEWSTATE", "UTF-8") + "=" + URLEncoder.encode(viewstate, "UTF-8");
          postValues += "&" + URLEncoder.encode("__EVENTVALIDATION", "UTF-8") + "=" + URLEncoder.encode(eventvalidation, "UTF-8");
          
          if (connection != null) {
            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
            
            //write parameters
            writer.write(postValues);
            writer.flush();
            
            //get the response
            StringBuffer answer = new StringBuffer();
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                answer.append(line);
            }
            writer.close();
            reader.close();
            
            //output the response
            System.out.println(answer.toString());
				}
      }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
W Zugriff auf Objektvariablen vs. Übergabe Allgemeine Java-Themen 3
kodela Übergabe einer Referenz Allgemeine Java-Themen 20
X Übergabe ... args Allgemeine Java-Themen 5
F Übergabe eines Befehls an Dos-Box Allgemeine Java-Themen 5
S OOP this-Referenz als Konstruktor-Übergabe Allgemeine Java-Themen 8
nutellastulle Zugriff, Übergabe, Bearbeitung und Ausgabe von Jlist Allgemeine Java-Themen 6
M Übergabe mehrer Files an selbstprogrammieren Parser Allgemeine Java-Themen 4
A Problem bei Übergabe von Werten in ein double Array. Allgemeine Java-Themen 21
S Übergabe / Aufruf einer beliebigen Methode in einer anderen Allgemeine Java-Themen 9
W Threads & Pipes --> Ist eine Übergabe von Objekten mö Allgemeine Java-Themen 7
P Übergabe- Parameter SQL Map Allgemeine Java-Themen 45
M Übergabe von Referenzen Allgemeine Java-Themen 3
G Probleme bei String Übergabe um Public Key zu erzeugen ? Allgemeine Java-Themen 6
R Übergabe und Autostart von Paint Allgemeine Java-Themen 4
V Übergabe per Referenz. Allgemeine Java-Themen 5
L Array Übergabe Allgemeine Java-Themen 8
G Übergabe funzt nicht, aber wieso? Allgemeine Java-Themen 3
J Methoden per Übergabe eines "Methodennamen-Strings&quot Allgemeine Java-Themen 20
lhein Übergabe von Objekten von Java an C über JNI Allgemeine Java-Themen 5
C Übergabe Parameter verändert Allgemeine Java-Themen 5
G Json POST-REQUEST Allgemeine Java-Themen 14
M Maven Deutsche Post API implementieren Allgemeine Java-Themen 2
P REST- Services GET/PUT/POST/DELETE Allgemeine Java-Themen 6
J Post: #1could not create the java virtual machine etc Allgemeine Java-Themen 6
S http POST überwachen Allgemeine Java-Themen 2
S OutputStream via POST senden Allgemeine Java-Themen 4
dayaftereh HttpClient Post, Get Cookie Allgemeine Java-Themen 1
P POST Problem Allgemeine Java-Themen 5
A POST Allgemeine Java-Themen 6
J httpclient: Post-method aber trotzdem "URI to long&quot Allgemeine Java-Themen 4
thE_29 CGI Seite + Post Methoden Allgemeine Java-Themen 2
P URL mit POST variablen aufrufen Allgemeine Java-Themen 5
P Post-Parameter übergeben Allgemeine Java-Themen 3
N Servlets: Formulardaten auslesen (POST) - mehr Informationen Allgemeine Java-Themen 4
A Formular POST übergabe an Servlet Allgemeine Java-Themen 4
Thallius HTTPS Request mit unbekannter Instanz Allgemeine Java-Themen 24
J Threads HTTP Request (Thread) dauert lange - in Android Allgemeine Java-Themen 3
T Basic Request von php zu Java Allgemeine Java-Themen 3
K http request get Allgemeine Java-Themen 2
W Request elevated rights (Vista) Allgemeine Java-Themen 9
A Threads zum Verringern der Latenzzeiten bei HTTP GET Request Allgemeine Java-Themen 8
G Array/String aus Request wieder in Array konvertieren Allgemeine Java-Themen 2
M Textdatei per Request lesen? Allgemeine Java-Themen 2
S HTTPUnit Test Fehler: Error on HTTP request: 500 Internal Er Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben