Autor |
Beitrag |
OliverN_26
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Mi 22.02.12 20:21
Hi Leute
vorab .. ich weiß ich bin hier heute völlig falsch, da ich in diesem Schritt nicht mit Delphi arbeite, aber ich weiß kein gutes Forum für meine Frage und ich weiß, dass hier ne Menge Cracks rum schwirren, die evt. eine Idee haben.
also ..
Mit Delphi empfange ich Daten, werte diese aus und sende sie an meine Datenbank, wo sie auf einer Internet-Seite angezeigt und weiter bearbeitet werden. Soweit so gut. Wir sind ein Subunternehmer eines großen, namhaften Unternehmens hier in Deutschland. Die Bearbeitung der Daten kann leider nicht nur in unserem System passieren, sondern muss ebenfalls in einer Webseite eingetragen werden, um an den "großen Partner" gesendet werden zu können. Dies ist natürlich doppelte Arbeit die ich mir gerne ersparen würde. Ich möchte also die Daten in meinem Internetformular bearbeiten und im Hintergrund sollen die "notwendigen" Daten an die fremde Internetseite geschickt werden. Ein weiteres Problem dabei ist, dass ich die Seite 3-5x bestätigen muß und Folgeseiten ebenfalls ausgefüllt werden müssen. Kann man so was simulieren?
Bevor die Diskussion aufkommt .. es ist nichts illegales und bewegt sich alles im Firmenumfang. Wenn ich den Namen sagen würde, würde sich auch die Frage erübrigen den Partner nach einer Datenbank-Schnittstelle zu fragen. Die kümmern sich da leider "0" drum.
Ich habe bei einem anderen Subunternehmer allerdings schon mitbekommen das dies möglich ist. "Angeblich" auf sehr einfach Weise (mit den Scripten rücken auch die nicht raus).
Mich würde schon mal weiter bringen wenn ich wüsste, mit welcher Sprache man so was bewerkstelligen kann. PHP kann ich mir wenig vorstellen, da es serverseitig arbeitet, aber, wenn ich im Internet suche, gerate ich immer wieder an "fsockopen()". Bin ich da auf dem richtigen Weg? Hat jemand mit so was Erfahrungen und kann mich in die richtige Richtung rollen oder mir ein paar Tips geben?
Weiß da grad echt keinen Rat mehr .. hoffe, auch wenns grad nich Delphi ist kann mir jemand helfen.
1000 Dank im voraus
lg
Oli
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 22.02.12 23:43
Moin!
OliverN_26 hat folgendes geschrieben : | Ich möchte also die Daten in meinem Internetformular bearbeiten und im Hintergrund sollen die "notwendigen" Daten an die fremde Internetseite geschickt werden. Ein weiteres Problem dabei ist, dass ich die Seite 3-5x bestätigen muß und Folgeseiten ebenfalls ausgefüllt werden müssen. Kann man so was simulieren? |
Ja klar kann man das. Wenn kein Javascript drin ist, geht das relativ simpel mit IdHTTP von den Indies, bei Javascript-Klamotten kann man das mit einem TWebbrowser probieren und dann über die COM-API darauf zugreifen (etwas hakelig, braucht Erfahrung).
OliverN_26 hat folgendes geschrieben : | wenn ich im Internet suche, gerate ich immer wieder an "fsockopen()". Bin ich da auf dem richtigen Weg? |
Pauschal würde ich sagen: nein, das wird nix. Damit öffnest du lediglich einen Socket (also theoretisch kann man das schon an der Stelle tatsächlich umsetzen, aber das wird sich keiner antun, den ganzen Protokoll-Layer selbst da oben drauf zu setzen).
Und die haben wirklich keinen Webservice für die Datenübermittlung? So wie du das beschreibst, ist das Formular (oder besser die Formularkaskade) eher für menschliche Benutzung vorgesehen...  Mit z.B. einem Webservice wäre das erheblich viel einfacher!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Do 23.02.12 08:17
Narses hat folgendes geschrieben : | Und die haben wirklich keinen Webservice für die Datenübermittlung? So wie du das beschreibst, ist das Formular (oder besser die Formularkaskade) eher für menschliche Benutzung vorgesehen... Mit z.B. einem Webservice wäre das erheblich viel einfacher! |
Leider nicht ganz unüblich. Das Problem ist, dass die "Großen" oft in einer Position sind, wo sie einfach bestimmen können. Das heißt dann, sie sagen "ihr müsst die Daten in dem Webformular eintragen. Fertig. Wenn euch das zu viel Arbeit ist, stellt halt noch einen Mann dafür ein.". Und aus Sicht des Datenempfängers besteht ja auch keine Notwendigkeit, eine definierte Schnittstelle zur Verfügung zu stellen. Der Partner kann die Daten ja im Formular eintragen. Da wäre es nur Mehraufwand, eine Schnittstelle zu entwickelt und zu pflegen.
Aus den Gründen muss ich auch an einigen Stellen Webformulare füttern. Wie schon gesagt: IdHttp.
Für POST sieht das dann prinzipiell so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| procedure TBlaBla.DoLogin(AUsername, APassword: String); var PostData : TStringList; ResultStream : TStringStream; const ANMELDENAME = 'anmeldename'; PASSWORT = 'password'; URI = 'http://.../index.php'; begin
PostData := nil; ResultStream := nil; try PostData := TStringList.Create; ResultStream := TStringStream.Create('', SysUtils.TEncoding.GetEncoding(1252));
PostData.Values[ANMELDENAME] := AUsername; PostData.Values[PASSWORT] := APassword; PostData.Values['site'] := 'login';
FHttp.Post(URI, PostData, ResultStream); ParseLoginResult(ResultStream);
finally PostData.Free; ResultStream.Free; end;
end; |
FHttp wird hier an einer anderen Stelle erzeugt. Das musst Du also noch machen, oder halt auf die Form klatschen.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 23.02.12 08:28
Und da es um mehrere Seiten geht, die der Reihe nach angesteuert werden müssen, könnte es notwendig sein auch einen Cookiemanager in TIdHttp einzubinden. Es kann aber auch sein, dass es IDs in der generierten Seite gibt, die du als Session-ID wieder mitschicken musst oder Ähnliches.
Falls es notwendig wird, könntest du mit Chrome, Opera oder IE 7+ und dessen integrierten Debugger (oder mit einem Browserplugin, wenn du den Firefox nutzen möchtest) nachschauen was da bei den Aufrufen so alles an Daten hin- und hergesendet werden.
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Do 23.02.12 11:27
Hi und schon mal danke für die Rückantworten.
An 1 Stelle haben wir uns glaub ich Missverstanden. Die Abwicklung mit Delphi ist durch und die Daten werden "nur" noch im Web-Bereich bearbeitet und ausgewertet. Das heisst die übermittlung der Daten wird nicht mit Delphi geschehen. Ich weiß nur nicht ob man so was was mit Javascript/PHP/CGI (oder sonst was) hinbekommt?!
Um das mit Delphi zu realisieren wäre es notwendig eine Tabelle in die Datenbank zu legen, in der die Daten, die für die anzusteuernde Seite wichtig sind, gespeichert werden müssen. Das Delphi Tool prüft dann einfach in regelmäßigen Abständen diese Tabelle und wenn Daten da sind werden sie abgeschickt. Wäre sicher auch ne Lösung, aber mit diesem Problem steh ich ziemlich am Anfang und bevor ich mir jetzt die Tage um die Ohren schlage, würd ich gern das ein oder andere abwägen um wirklich mit der optimalsten Lösung an den Start zu gehen.
Die Sache mit dem Webservice schau ich mir mal an. Angeboten bekommen wir das nicht. Wie "Nersgatt" das schon sagte interessiert die das recht wenig. Es existiert eine Internetseite wo wir die erforderlichen Daten einzutragen haben und fertig. Nur das hat absolut nichts mit einer internen Auftragsabwicklung zu tun und schon muß man alles doppelt machen. Bei unserer Auftragsmenge ist die ganze "sinnlose" Mehrarbeit einfach nich mehr machbar.
lg
Oli Moderiert von Narses: Beiträge zusammengefasstDie TWebBrowser Komponente ist schon mal ein guter Anfang, da ich die Formularfelder schon mal mit meinen Daten füllen kann. Glaub damit bin ich auch dem richtigen Weg. Problem was ich jetzt habe ist beim Senden des Formulares im Internet per "action" ein Link mit einer Session ID übergeben wird. Wie kann kann ich bei der Komponente mit "submit" Werte übergeben?
Mein jetziger Testversuch:
Delphi-Quelltext 1: 2: 3:
| WebBrowser1.OleObject.document.forms.item(0).elements.item('feld1').value := '22222'; WebBrowser1.OleObject.document.forms.item(0).elements.item('feld2').value := '36240'; WebBrowser1.OleObject.document.forms.item(0).submit; |
danke
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 23.02.12 19:17
Solange es keine dynamischen Inhalte auf der Seite geht, sollte TWebBrowser aber gar nicht notwendig und nur unnötiger Aufwand sein.
Wenn die Session ID in dem selben Formular steht, sollte diese auch im TWebBrowser mit übergeben werden. Was da genau passiert, könntest du mit Wireshark mit dem Original vergleichen.
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 24.02.12 12:14
Also ich sag mal so .. wenn es denn funktioniert mach ich mir diesen "einmaligen" unnötigen Aufwand sehr gerne
Was wäre denn die Alternative?
Ich hab mal ein bisschen gelesen und probiert, aber .
1. Wenn ich den Button in der TWebBrows-Komponente drücke gehts. Mach ich es mit WebBrowser1.OleObject.document.forms.item(0).submit; passiert zwar was aber anscheinend nicht richtig, denn ich gelange nicht auf die Folgeseite. Was an dem Action-Attribut liegen könnte ?!
2. Ein Auszug aus dem Quelltext der Form sieht wie folgt aus:
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9:
| <form id="orderDetails" method="post" action="/MWIA/fc.htm?_flowExecutionKey=_cA3DFCCBC-C30A-42C9-F2EA-E6D91FC94F6E_k4BBC10C6-C9F1-965E-1527-DCF683533B51"><br> <label for="techId">Techniker Nummer</label><br/> <input id="techId" name="techId" style="-wap-input-format: '5N'; -wap-input-required: true;" type="text" value="" maxlength="5"/><br><br/> <label for="woId">Auftragsnummer</label><br/> <input id="woId" name="woId" style="-wap-input-format: '6N'; -wap-input-required: true;" type="text" value="" maxlength="6"/><br/><br/> <input type="submit" class="button" name="_eventId_login" value="Bestätigen"/><br/><br/> </form> |
3. könnte ich rein theoretisch den Link mit Indy-HTTP und POST einfach so versenden:
Delphi-Quelltext 1: 2: 3: 4: 5:
| sl := TStringlist.Create; sl.Add('techId=12345'); sl.Add('woId=59478');
IdHTTP1.Post('http://' + Hostname + '/MWIA/fc.htm?_flowExecutionKey=_cA3DFCCBC-C30A-42C9-F2EA-E6D91FC94F6E_k4BBC10C6-C9F1-965E-1527-DCF683533B51',sl); |
Danke Moderiert von Narses: Beiträge zusammengefasstMit WebBrowser1.OleObject.document.forms.item(0).elements.item(2).click; funktioniert es so wie ich es will und ich würde alles so hinbekommen wie ich es gerne hätte. Das ist schon mal traumhaft .. aaaaber .. mich interessiert trotzdem die eventuelle Alternative, die jaenicke angesprochen hat. Es sollte nicht zu kompliziert sein. Welche generellen Nachteile zieht es mit sich wenn ich es mit der Webbrowser Komponente mache?
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 24.02.12 12:43
OliverN_26 hat folgendes geschrieben : | Welche generellen Nachteile zieht es mit sich wenn ich es mit der Webbrowser Komponente mache? |
- langsamer
- Du missbrauchst eine visuelle Komponente, obwohl nichts dargestellt werden soll
- Sicherheitsoptionen des Internet Explorer wirken sich aus
- Fehler sind schwerer zu finden
- ...
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 24.02.12 12:52
Wie sieht die Alternative aus ?
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.02.12 12:56
TIdHttp
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 24.02.12 13:24
OK .. und wie könnte so was aussehen?
Bei folgendem Code bekomm ich ständig die Meldung "http/1.1 500 Internal Server Error":
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button3Click(Sender: TObject); var sl : TStringList; session_id : String; begin session_id := copy(Webbrowser1.LocationURL,pos('?',Webbrowser1.LocationURL),Length(Webbrowser1.LocationURL));
sl := TStringlist.Create; sl.Add('techId=22222'); sl.Add('woId=59478');
IdHTTP1.Post('http://pfad/MWIA/fc.htm' + session_id, sl);
sl.Free; end; |
So ganz versteh ich das auch noch nicht. Mir leuchtet ein dass ich so die Daten an den Server übermittel. Aber ich muß ja auch das "klicken" simulieren da ich mich noch um 5 weitere Folgeseiten kümmern muß. Auf die muß ich ja auch gelangen ?!
Hilfe 
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.02.12 13:46
Ich vermute, dass das daran liegt, dass Du die Session-ID noch mit dem TWebbrowser ausliest. Du solltest Dich für eine Sache entscheiden.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 24.02.12 13:54
OK .. das stimmt .. das könnte sein .. aber selbst wenn ich das jetzt änder .. wie gelange ich auf die Folgeseite, damit ich diese ebenso auswerten und senden kann?
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.02.12 14:05
Du musst nicht nur die URL aufrufen, sondern auch auswerten, was der Server zurückliefert. (Siehe oben Beitrag von mir, ResultStream). Und dann schickst Du halt per Post die Daten ab, die der Server auf der 2. Seite erwartet.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 24.02.12 14:43
Wie gesagt: jaenicke hat folgendes geschrieben : | Falls es notwendig wird, könntest du mit Chrome, Opera oder IE 7+ und dessen integrierten Debugger (oder mit einem Browserplugin, wenn du den Firefox nutzen möchtest) nachschauen was da bei den Aufrufen so alles an Daten hin- und hergesendet werden. |
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 24.02.12 15:33
Ich bekomme an der folgenden Stelle immer den Fehler: "Zu viele Parameter"
Delphi-Quelltext 1:
| ResultStream := TStringStream.Create('', SysUtils.TEncoding.GetEncoding(1252)); |
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.02.12 15:43
Versuch mal so: ResultStream := TStringStream.Create();
Die Überladungen kamen vermutlich erst in späteren Delphiversionen.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
OliverN_26 
      
Beiträge: 252
Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
|
Verfasst: Fr 24.02.12 15:46
"Nicht genügend wirkliche Parameter"
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 24.02.12 15:54
Dann stell mal den Cursor auf TStringStream und drück auf F1... 
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 24.02.12 16:05
Früher hatte TStringStream einen Parameter. Da kannst du einen leeren String angeben, also sprich nur den zweiten Parameter weglassen.
Nersgatt hat folgendes geschrieben : | Dann stell mal den Cursor auf TStringStream und drück auf F1...  |
Full Ack...
Und davon abgesehen zeigt Delphi ja auch an welche Parameter erwartet werden, wenn man die Klammer auf schreibt. Und mit Strg + Shift + Leertaste ebenfalls.
|
|