Indy - Post per TIdHTTP funktioniert nicht



  • Hi,
    kannst jemand mir vielleicht sagen, warum die post-methode beim TIdHTTP (Indy) nicht funktioniert?

    ich mache folgendes:

    TStringList* DataString = new TStringList;
    DataString->Add("op=test");
    Text = IdHTTP1->Post("http://www.domain.de/script.php",DataString);

    Leider kommt in meinem php, indem ich nur die Variable $op ausgebe nichts an.
    Also am php liegt es auf keinen Fall, denn wenn ich
    IdHTTP1->Get("http://www.domain.de/script.php?op=test);
    mache, dann geht es ja.
    Was mache in denn evtl. falsch?

    Gruß
    Tgod

    [ Dieser Beitrag wurde am 24.04.2003 um 19:54 Uhr von Jansen editiert. ]



  • Ich kenn mich ja in PHP überhaupt nicht aus, aber kann es sein, dass PHP einen Unterschied zwischen GET und POST macht ? Die Datenübergabe dieser beiden Methoden ist nämlich grundverschieden. Jansen hätte dann nämlich recht wenn er den Fehler im PHP Skript vermutet 😉



  • Also ich kenn mich in php sehr gut aus. Ich arbeite damit schon 2 Jahre intensiv.
    Ob die Werte per get oder post übergeben werden ist im php nicht relevant. Ich weiss allerdings eben nicht, wie die Indy-Komponente den Post durchführt. Vielleicht schickt die Indy-Komponente auch irgendwie ein anderes Format, oder im Header ist was anders, als wenn man nen Post über ein Formular sendet.
    Hoffe irgendjemand hier hat sowas schon mal gemacht, der mir dabei helfen kann!?

    Gruß
    TheOne



  • Also, ich hab gerade explizit TidHTTP::Post ausprobiert. Es geht tatsächlich mit POST überhaupt nicht. Nichts zu machen, die Parameter kommen einfach nicht rüber. GET dagegen funkioniert wie erwartet. Hab mir dann mal die Indy Demos runtergeladen, da ist ein Beipiel dabei, aber auch das funktioniert mit POST nicht. Keinen blassen Dunst was da wo falsch läuft. Habs jetzt erst mal aufgegeben, muss noch was anderes machen 😞



  • Das muss irgendwas mit dem ContentType zu tun haben, denn dieser Code gibt zumindest etwas zurück:

    TStringStream *Params = new TStringStream("");
    Params->WriteString("sys_return_url=ABCDEFGHIJKLM");
    
    IdHTTP1->Request->ContentType = "application/x-www-form-urlencoded";
    Memo1->Text = IdHTTP1->Post("http://localhost/index.php", Params);
    
    delete Params;
    

    Jetzt brauchen wir halt nur noch den richtigen Typ. 🙂



  • Komisch. Ich gucks mir heute Abend auch noch mal an. Probier doch mal al Content-Type text/plain (oder so ähnlich).



  • H Leute,

    grossen Dank an euch.
    Nun funktioniert es bei mit perfekt.
    Ich habe einfach wie oben erwähnt, application/x-www-form-urlencoded genommen.

    Jetzt kommt alles im php perfekt an.

    Also Danke nochmal.

    Gruß
    TheOne



  • Is ja voll krass 🕶 Es geht jetzt tatsächlich.
    Der Content-Type war wirklich dran schuld. Es muss da anscheinend was angegeben werden, was ist egal (man kann wirklich egal da eintagen ;). Ich habs auch mal mit dem "richtigen" Type für HTML-Seiten probiert, text/html (nicht text/plain), auch da tut es astrein tun tun :).
    Super duper, das I-Tüpfelchen von Jansen hatte noch gefehlt 😃



  • Das finde ich wiederum krass! 🙂
    Denn text/html etc. hatte ich selbstverständlich auch schon probiert, aber das funktioniert bei mir nicht. 😞
    Kannst du bitte, nur zur Scherheit, mal deinen Code und das PHP-Skript zeigen? Danke!



  • Klar, aber ich habs ohne PHP gemacht. Ich hab ein eigenes CGI-Prog so modifiziert, dass es mir die ganzen VARs anzeigt. Kannst Du auch probieren, es ist noch online. Lass Dich nicht durch zusätzliche Vars irritieren die mit JS hinten enden, die werden für spezielle Fälle vom Programm generiert 😉
    Hier das Testprogramm. Die Post-Variablen werden zwar hier in einem Stream übergeben, aber das dürfte wohl egal sein. Habs am Anfang mit TStrings probiert und dann auf TStream umgestellt in der Hoffnung es geht damit. Aber der Fehler lag ja ganz woanderst, gell 😃

    char params[64];
    TMemoryStream *InStream=new TMemoryStream();
    TMemoryStream *OutStream=new TMemoryStream();
    
    strcpy(params, "MY_VAR1=5&MY_VAR2=77");
    
    OutStream->Write(params, strlen(params));
    
    IdHTTP1->Request->ContentType="egal";
    //  IdHTTP1->Request->ContentType="text/html";
    
    IdHTTP1->Post("http://pm.profidata.de/cgi/pmforms.exe", OutStream, InStream);
    
    InStream->Position=0;
    Memo1->Lines->LoadFromStream(InStream);
    
    delete OutStream;
    delete InStream;
    

    [ Dieser Beitrag wurde am 16.03.2002 um 21:07 Uhr von Peter editiert. ]



  • Das wird ja immer krasser. 😃

    Bei deinem Code kann ich die ContentType-Zeile auch weglassen und bekomme trotzdem die Variablen zurück ...



  • Häää, ja lüg ich denn, ohne die Content-Zeile gehts bei mir aber nicht. Sehr seltsam. Weisst Du zufällig wie man die Indy Version rauskriegt ? Vielleicht liegts ja mitunter auch daran. Ich hab zwar die 8'er installiert, aber was für ne "Unterversion" weiss ich nicht mehr.

    Anmerkung des Moderators:
    Der Thread wurde zur Information in die FAQ aufgenommen. Sollte jemand über eine endgültige Lösung des Problems verfügen, bitte im VCL-Forum darauf hinweisen. Danke!

    Siehe auch hier.

    [ Dieser Beitrag wurde am 28.12.2002 um 13:35 Uhr von Jansen editiert. ]


Anmelden zum Antworten