# Post Request in Java



## B00bietrap (22. Sep 2011)

Tudiluuu liebe Mitprogrammierer

Es handelt sich um folgendes.
Ich möchte einen http request mit Java simulieren.
Es handelt sich dabei um einen Request, den ich mit Hilfe von Fiddler2 ausgelesen habe:


```
POST /cgi-bin/cgi HTTP/1.1
Host: 192.168.1.10
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: */*
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Content-Type: text/plain; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://192.168.1.10/index.xhtml
Content-Length: 9
Pragma: no-cache
Cache-Control: no-cache

GetImage
```

Nun würde ich diesen Request gerne simulieren. Dazu verwende ich ne vorlage...
Das Programm sieht momentan Folgendermassen aus:


```
package httprequest;

import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

import java.io.*;
import java.util.*;
import java.util.zip.GZIPInputStream;


public class WebScrapingTesting {

public static void main(String[] args) throws Exception {
    String target = "192.168.1.10";

    HttpClient client = new DefaultHttpClient();

    HttpPost httpPost = new HttpPost(target);
    BasicNameValuePair[] params = {
            new BasicNameValuePair("jpState", "single"),
            new BasicNameValuePair("commandName", "journeyPlannerCommand"),
            new BasicNameValuePair("from.searchTerm", "Basingstoke"),
            new BasicNameValuePair("to.searchTerm", "Reading"),
            new BasicNameValuePair("timeOfOutwardJourney.arrivalOrDeparture", "DEPART"),
            new BasicNameValuePair("timeOfOutwardJourney.monthDay", "Today"),
            new BasicNameValuePair("timeOfOutwardJourney.hour", "10"),
            new BasicNameValuePair("timeOfOutwardJourney.minute", "15"),
            new BasicNameValuePair("timeOfReturnJourney.arrivalOrDeparture", "DEPART"),
            new BasicNameValuePair("timeOfReturnJourney.monthDay", "Today"),
            new BasicNameValuePair("timeOfReturnJourney.hour", "18"),
            new BasicNameValuePair("timeOfReturnJourney.minute", "15"),
            new BasicNameValuePair("_includeOvertakenTrains", "on"),
            new BasicNameValuePair("viaMode", "VIA"),
            new BasicNameValuePair("via.searchTerm", "Station name / code"),
            new BasicNameValuePair("offSetOption", "0"),
            new BasicNameValuePair("_reduceTransfers", "on"),
            new BasicNameValuePair("operatorMode", "SHOW"),
            new BasicNameValuePair("operator.code", ""),
            new BasicNameValuePair("_lookForSleeper", "on"),
            new BasicNameValuePair("_directTrains", "on")};

    httpPost.setHeader("Host", "192.168.1.10");
    httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");
    httpPost.setHeader("Accept", "*/*");
    httpPost.setHeader("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
    httpPost.setHeader("Accept-Encoding", "gzip, deflate");
    httpPost.setHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    httpPost.setHeader("Connection", "keep-alive");
    httpPost.setHeader("X-Requested-With" , "XMLHttpRequest");
    httpPost.setHeader("Referer", "http://192.168.1.10/index.xhtml");
    httpPost.setHeader("Content-Type", "text/plain; charset=UTF-8");
    httpPost.setHeader("Content-Length", "9");
    httpPost.setHeader("Pragma", "no-cache");
    httpPost.setHeader("Cache-Control", "no-cache");


    UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(Arrays.asList(params));
    urlEncodedFormEntity.setContentEncoding(HTTP.UTF_8);
    httpPost.setEntity(urlEncodedFormEntity);
    HttpResponse response = client.execute(httpPost);

    InputStream input = response.getEntity().getContent();
    GZIPInputStream gzip = new GZIPInputStream(input);
    InputStreamReader isr = new InputStreamReader(gzip);
    BufferedReader br = new BufferedReader(isr);

    String line = null;
    while((line = br.readLine()) != null) {
        System.out.printf("\n%s", line);
    }

    client.getConnectionManager().shutdown();
}
}
```

Ich habe meine Daten eingetragen... allerdings Weiss ich nicht wozu die oberen Parameter sind und habe diese unverändert gelassen.
Wenn ich nun das Programm im NetBeans starte, erhalte ich eine Fehlermeldung und die Simulation wird abgebrochen.
Kann mir da Jemandweiterhelfen wie ich das Reparieren kann oder obs einen anderen Weg gibt?


```
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
        at org.apache.http.impl.client.AbstractHttpClient.<init>(AbstractHttpClient.java:182)
        at org.apache.http.impl.client.DefaultHttpClient.<init>(DefaultHttpClient.java:150)
        at httprequest.WebScrapingTesting.main(WebScrapingTesting.java:21)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        ... 3 more
Java Result: 1
```

Danke fürs anschauen.

greez B00bietrap


----------



## SlaterB (22. Sep 2011)

HttpClient - HttpClient Tutorial



> Getting Ready
> The first thing you need to do is get a copy of HttpClient and its *dependencies*.


darunter
Commons Logging - Overview


----------



## DerEisteeTrinker (22. Sep 2011)

google mal nach "Apache Commons Logging" da findest ein Jar, das bindest mit ein und der Fehler sollte nicht mehr auftreten

EDIT: M*** da war wer schneller ;(


----------



## B00bietrap (22. Sep 2011)

Yay, Danke.
Hat soweit geklappt^^
Leider scheint weiter unten im Programm noch ein Bock zu sein :S
Hatte n Target Host Fehler.. der is behoben, hab in der Variable Target die ganze url angegeben


```
public static void main(String[] args) throws Exception {
    String target = "http://192.168.1.10/index.xhtml";
```

Und der Header Content-Lengt sei schon vorhanden... hab den ma auskommentiert um den Fehler zu beheben


```
httpPost.setHeader("Content-Type", "text/plain; charset=UTF-8");
    //httpPost.setHeader("Content-Length", "9");
    httpPost.setHeader("Pragma", "no-cache");
```

Den nächsten Fehler verstehe leider ich nicht...


```
Exception in thread "main" java.io.IOException: Not in GZIP format
        at java.util.zip.GZIPInputStream.readHeader(GZIPInputStream.java:137)
        at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:58)
        at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:68)
        at httprequest.WebScrapingTesting.main(WebScrapingTesting.java:68)
Java Result: 1
```

was bedeutet das?
danke für die schnellen Antworten


----------



## SlaterB (22. Sep 2011)

kennst du die Wörter GZip und Format?
verstehst du den Satz 'eine Datei ist im GZip-Format'?
dann müsste doch als nächstes die Fehlermeldung 'Not in GZIP format' auch verständlich sein? 

warum das Format nicht vorliegt oder erkannt wird kann Unmengen Grünge haben,
über verschiedene PCs, Netze, Programmiersprachen irgendwelche kompliziert formatierte Dateien auszutauschen ist nunmal nicht gerade Grundlagenarbeit,
wenn es nicht funktioniert.., tja, genaues kann ich eigentlich nicht sagen, mit Glück brauchst du nur ein anderes charset oder irgendwas triviales,
mit Pech viel schlimmeres (worauf ich nie kommen würde)


----------



## B00bietrap (22. Sep 2011)

Den Fehler kann ich schon lesen... hab aber nich den hauch einer Ahnung wie sich der beheben lässt.
Dann wird eben n bissle rumgespielt^^


----------



## B00bietrap (22. Sep 2011)

... 

```
InputStream input = response.getEntity().getContent();
    //GZIPInputStream gzip = new GZIPInputStream(input);
    InputStreamReader isr = new InputStreamReader(input);
```
Nur nich zu weit suchen...
Jetzt muss noch der "RequestBody" GetImage wahrscheinlich irgendie reingehämmert werden den konnt ich noch nirgends unterbringen.
SIeht aber soweit gut aus


```
<HTML><HEAD><TITLE>400 Bad Request</TITLE></HEAD>
<BODY><H1>400 Bad Request</H1>
Your client has issued a malformed or illegal request.
</BODY></HTML>BUILD SUCCESSFUL (total time: 2 seconds)
```


----------



## nillehammer (22. Sep 2011)

> <HTML><HEAD><TITLE>400 Bad Request</TITLE></HEAD>
> <BODY><H1>400 Bad Request</H1>
> Your client has issued a malformed or illegal request.
> </BODY></HTML>


Ich würde mal annehmen, dass das am Target Deines Posts liegt. "http://192.168.1.10/index.xhtml" ist im Post-Header als Referrer angebeben. Das sieht für mich nach der Seite aus, in dem das Formular liegt, an das Du den Post senden willst. Diese wird bestimmt ohne Parameter per GET aufgerufen und ist höchstwahrscheinlich nicht das richtige Target für den POST. Falls es tatsächlich ein Formular ist, schau Dir im (HTML-)Quelltext mal das action-Attribut des form-Tags an. Das ist das richtige Target. 


```
X-Requested-With: XMLHttpRequest
```
Das sieht nach AJAX aus., könnte also auch eine AJAX-Komponente statt eines Formulars sein.
Falls es irgend eine AJAX-Komponente ist, müsstest Du Dir von der das richtige Target raussuchen.

Außerdem kann es bei AJAX-Requests auch sein, dass die Daten nicht als Post-Parameter sondern als JSON erwartet werden. Hier hilft evtl. ein Blick in die Logs des Servers.


----------



## nillehammer (22. Sep 2011)

Ach ja und zum Thema Gzip:

```
Accept-Encoding: gzip, deflate
```
Mit dem Header sagtst Du dem Server, dass er seinen Response entweder im gzip-Format oder unkomprimiert senden darf. Die Entscheidung, was er davon nutzt, obliegt dem Server. Dieser macht es meist von der Länge des Responses ab. Ab einer gewissen Länge benutzt er gzip. Der von Dir provozierte Response (mit der kurzten Fehlermeldung) war wohl für gzip-Komprimierung zu kurz. Wenn Du Dein Programm aber mal soweit hast, dass Du den richtigen Response zurückbekommst, kann es passieren, dass Du dann wieder einen gzip-Komprimierten Response bekommst. Ich dacht, ich sag's Dir schonmla. Nicht dass Du Dich hinterher wunderst.


----------



## B00bietrap (22. Sep 2011)

Jo,  Target hab ich geändert.


```
String target = "http://192.168.1.10/cgi-bin/cgi";
```






Allerdings bleibt nun das Programm stecken :S
Im Quelltext is leider kein action-Attribut zu finden.
Dieser Request würds sonst üblicherweise aus dem JavaScript ausgeführt.

Edit: Danke nillehammer... werd mir das mit dem Gzip ma anschauen.

Danke für die Hilfe schonma


----------



## nillehammer (22. Sep 2011)

> http://192.168.1.10/cgi-bin/cgi


Bist Du sicher, dass das das richtige Target ist? Ich kenne keinen Programmierer, der sein cgi-Script einfach cgi nennt.



> Im Quelltext is leider kein action-Attribut zu finden. Dieser Request würds sonst üblicherweise aus dem JavaScript ausgeführt.


Dann sag/zeig doch bitte, aufgrund welcher Aktion der POST normalerweise ausgelöst wird. Aufgrund von Einträgen in ein Formular und klicken eines Submit-Buttons, Aufgrund des Klicks auf irgendeine mit JavaScript/AJAX aufgepimpte GUI-Komponente?


----------



## B00bietrap (22. Sep 2011)

nillehammer hat gesagt.:


> Bist Du sicher, dass das das richtige Target ist? Ich kenne keinen Programmierer, der sein cgi-Script einfach cgi nennt.
> 
> 
> Dann sag/zeig doch bitte, aufgrund welcher Aktion der POST normalerweise ausgelöst wird. Aufgrund von Einträgen in ein Formular und klicken eines Submit-Buttons, Aufgrund des Klicks auf irgendeine mit JavaScript/AJAX aufgepimpte GUI-Komponente?



Die Post aktion habe ich mit dem Fiddler 2 gefunden.
Die Webseite startet 5 JavaScript Dateien die im ganzen 13 000 Zeilen beinhalten.
Darin ist an einer Stelle 

```
type: "POST",
url: "/cgi-bin/cgi"
```
ansonsten sind keine weiteren Hinweise darin zu finden. 
An einigen Stellen kommt auch das tolle AJAX vor^^
Daher hab ich mich and den Fiddler gehalten...


----------

