CGI-Aufruf mit BCB und Indy8
-
Und schon wieder hab ich ein Problem. Bin Anfänger in dem Bereich und den ganzen Tag damit beschäftigt im Web Informationen zu finden. Aber was soll's.
Also folgendes: Ich möchte von meiner Anwendung (BCB6 Pro) ein CGI-Script anschmeißen, was eine Datei, die sich auf dem Webserver befindet einließt und die Daten aus der Datei in eine Datenbank schreibt. Dieser Umweg ist nötig, da ich bis jetzt noch keine Möglichkeit gefunden habe, direkt auf die DB zuzugreifen.
Leider habe ich von cgi-Programmierung keine Ahnung. Habe mir hier schon die Beispiele angesehen. Dabei habe ich folgende Probleme, wo mir der Ansatz fehlt:
- Das CGI-Script soll an die BCB-Anwendung einen Rückgabewert geben, so dass ich weiss, ob die Verarbeitung funktioniert hat.
- Wenn ich jetzt eine HTML-Ausgabe wünsche: wann und wie muss ich den Browser öffnen, wenn ich jetzt die Indy-Komponente benutze, wie hier im Forum schon beschrieben (FAQ)? Aufruf mit POST: http://www.c-plusplus.net/forum/viewtopic.php?t=39218Also wie gesagt, mir fehlt schon der Ansatz. Ich habe letzte Woche mal ein CGI-Beispiel mit dem BCB erstellt. Wenn ich das mit:
TStringStream *Params = new TStringStream(""); Params->WriteString("sys_return_url=ABCDEFGHIJKLM"); TMemoryStream *InStream=new TMemoryStream(); Button4->Caption = "conncected"; //IdHTTP1->Get() AnsiString Url = "http://localhost/cgi-bin/test.cgi"; IdHTTP1->Post(Url,Params, InStream); delete Params; delete InStream;
aufrufe bekomme ich die Fehlermeldung:
'' kein gültiger Integerwert
für das Beispiel hab ich die CGIExpert-Komponenten benutzt.
Ich hoffe ich habe jetzt nicht zusehr gegen die Regel 1 Frage/1 Thread verstoßen.
-
Bist du sicher, dass die Fehlermeldung von dem von dir gezeigten Code verursacht wird? Wenn ja, in welcher Zeile?
-
Die Fehlermeldung kommt nach dem POST.
Wenn ich das CGI direkt aufrufe im IE, dann wird eine Zeile im HTML ausgegeben.
Ich weiss nicht, ob du die CGIExpert-Komponenten kennst. Habe einfach mal zum Test ein Beispiel von denen benutzt. Einfach zum Test, da ich noch nie vorher ein CGI gemacht hab. Ich habe zum Test den Source noch mal geändert. Aber die gleiche Fehlermeldung bekommen, wie vorher.TStringStream *Params = new TStringStream(""); //Params->WriteString("sys_return_url=ABCDEFGHIJKLM"); Params->WriteString(""); <-- geänderte Zeile TMemoryStream *InStream=new TMemoryStream(); Button4->Caption = "conncected"; AnsiString Url = "http://localhost/cgi-bin/test.cgi"; IdHTTP1->Post(Url,Params, InStream); delete Params; <--- da bleibt der Coursor stehen, bei der Ausführung delete InStream;
Wenn ich nur die URL angeben, was ja reichen würde, bekomme folgende Fehlermeldung vom Compiler:
[C++ Fehler] MainForm.cpp(1114): E2285 Keine Übereinstimmung für 'TIdHTTP::Post(AnsiString)' gefunden
Weiss nicht mehr weiter.
-
So um weitere Fehler auszuschließen bzw. die Fehlersuche zu vereinfachen.
Ich habe eine neue C-Anwendung erstelle. Nicht C++ sondern C, mit Hilfe des Konsolen-Experten. Das ganze habe ich so gelassen, wie es vom BCB erzeugt wird. Die Einzige Source-Zeile, die es gibt ist return 0 Und auch diese Zeile wurde vom BCB automatisch erzeugt.
So, wenn ich jetzt das CGI mit obigem Source aufrufe, dann bekomme ich auch genau wieder die Fehlermeldung'' ist kein gültiger Integerwert
Aufgerufen wird der Source über einen Buttonclick. Zuvor wird natürlich zum Server connected. (Sollte eigentlich klar sein)
Ich hoffe, mir kann jetzt jemand helfen.
-
Hm, jetzt war ich 2 Wochen im Urlaub. Kann mir denn niemand helfen?
-
Noch mal nach oben schieb. *schieb*
Hoffe, dass mir jemand helfen kann. Ich weiss echt nicht weiter.
-
Ich kann dein Problem nicht nachvollziehen, allerdings verwende ich hier Indy 9.00.14. Serverseitig benutze ich das CGIExpert-Beispiel "FormInput", der Aufruf über Indy sieht eigentlich genauso aus wie bei dir:
// TStringStream *Params = new TStringStream(""); TStringStream *Response = new TStringStream(""); IdHTTP1->Post("http://localhost/cgi-bin/Input3.exe", Params, Response); Response->Position = 0; Memo1->Text = Response->ReadString(Response->Size); delete Params; delete Response;
Im Memo wird dann der korrekte HTML-Code für das Web-Formular angezeigt.
-
Danke Jansen für deine Hilfe, leider bekomme ich die Indy-9-Kompos nicht installiert, wie ich dort: http://www.c-plusplus.net/forum/viewtopic.php?t=8747&start=15 schreibe.
Somit hab ich das Prob noch immer nicht gelöst. Ich werde mal das CGI-Expert-Beispiel probieren, was du auch benutzt hast.
-
Nur zur Info:
Also mit dem CGI-Expert-Beispiel bekomme ich die Fehlermeldung nicht. Habe allerdings wie in deinem Beispiel den MemoryStream gegen einen StringStream ausgetauscht.
-
Also entweder hab ich was falsch verstanden, oder ihr versucht es zu kompliziert.
Ich hab einen Apache Webserver unter Windows laufen. Im dortigen CGI-Verzeichniss liegt eine *.exe des BCB. Diese Exe wird im IE per Url mit Parametern aufgerufen (z.B. http:\\meinserver\meinproggi.cgi?param1=tralala).Die Exe verhält sich so, als würde sie ganz normal mit einem Parameter gestartet. Es können natürlich auch 2 oder xxxx Parameter übergeben werden. Die Exe (die auch *.cgi heissen kann) schreibt dann meine Daten in einen Datenbank oder macht was anderes, gerade was halt an Parametern kommt.
Achtung: Es sollte ein Apache 1.3 sein, der zerlegt die URL in einzelne Parameter. Bei dem neuen 2er wurden alle Parameter als eine Zeile an die Exe übergeben. Also am Besten->Testen.
Viel Spass
-
spool schrieb:
Also entweder hab ich was falsch verstanden, oder ihr versucht es zu kompliziert.
Ich denke mal, du hast uns falsch verstanden.
Das CGIExpert-Beipiel habe ich nur gewählt a) weil Jacques sich explizit auf die CGIExpert-komponenten bezog und b) weil dieses Beispiel sinnvollen Output produziert, anhand dessen man sich leicht vom Erfolg (oder Misserfolg) des Aufrufes überzeugen kann.Aber das Problem bei Jaques ist ja nicht das Erzeugen der Webanwendung oder deren generelle Funktionsfähigkeit (im IE geht's ja auch bei Jacques), sondern das Ansprechen der Webanwendung mittels der Indy-Komponente.
-
@Jansen: besser hätte ich es auch nicht sagen können
Ansonsten können wir das Thema beenden, da jetzt alles läuft. Ich weiß zwar nicht, was anders ist als vorher, aber es funktioniert nun endlich. Ich hatte zwischendurch wie schon gesagt die Indy9-Komponenten installiert und wieder deinstalliert. Vielleicht ist da jetzt ein Komponentendurcheinander auf meiner Platte und es funktioniert deshalb. Keine Ahnung. Auch mit den "alten" Beispielen, gibt es die Fehlermeldung nicht mehr.
-
[edit]
durch Verbindungsfehler wurde der Post doppelt eingetragen
[/edit]