# Übergabe von post request Parametern



## java_einsteiger (5. Feb 2012)

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.


```
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 (6. Feb 2012)

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


----------



## java_einsteiger (6. Feb 2012)

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.


----------



## java_einsteiger (8. Feb 2012)

Hallo zusammen,

gibt es ggf. noch weitere Ideen oder Vorschläge?

Danke!


----------



## ARadauer (8. Feb 2012)

schau dir das mal an doPostBack, macht das einen ajax call?


----------



## java_einsteiger (8. Feb 2012)

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 (8. Feb 2012)

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


----------



## java_einsteiger (8. Feb 2012)

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!


----------



## java_einsteiger (10. Feb 2012)

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 
	
	
	
	





```
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:


```
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!


----------



## java_einsteiger (10. Feb 2012)

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!


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


----------

