Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdHttpServer und XML (https://www.delphipraxis.net/41758-tidhttpserver-und-xml.html)

FrankBrin 8. Mär 2005 08:00


TIdHttpServer und XML
 
Hallo,
ich habe gerade die Aufgabe einen HTTP - Server zu basteln, der XML versteht. Und zwar soll das so funktionieren.
Ein Client sendet via POST Kommando ein XML Dokument. Mein Server empfängt es und soll als Antwort (Response) ein anderes XML Dokument senden, welches auf den Inhalt des empfangenen Docs reagiert.

Ich habe dazu eine TIdHTTPServer- und eine TXMLDocument - Komponente verwendet. Nun klappt das auch schon mit dem Empfangen des XML Docs. Doch wenn ich dann in dem Ereignis OnCommandGet des Servers das bereits als Datei gespeicherte XML auswerten möchte, sagt mir TXMLDocument, das die Datei nicht zu öffnen wäre. Mach ich das Ganze ausserhalb des OnCommandGet - Ereignisses wird das XML gelesen und ausgewertet. Leider hat der Server dann schon ein schlichtes 200 - OK gesendet und die Session ist beendet.

:?: Kennt jemand eine Lösung oder weiss einen Link der mir weiterhilft? Bei Indy selbst hab ich nix gefunden.

shmia 8. Mär 2005 09:04

Re: TIdHttpServer und XML
 
Zitat:

Zitat von FrankBrin
ich habe gerade die Aufgabe einen HTTP - Server zu basteln, der XML versteht. Und zwar soll das so funktionieren.
Ein Client sendet via POST Kommando ein XML Dokument. Mein Server empfängt es und soll als Antwort (Response) ein anderes XML Dokument senden, welches auf den Inhalt des empfangenen Docs reagiert.

Ich habe dazu eine TIdHTTPServer- und eine TXMLDocument - Komponente verwendet. Nun klappt das auch schon mit dem Empfangen des XML Docs. Doch wenn ich dann in dem Ereignis OnCommandGet des Servers das bereits als Datei gespeicherte XML auswerten möchte, sagt mir TXMLDocument, das die Datei nicht zu öffnen wäre. Mach ich das Ganze ausserhalb des OnCommandGet - Ereignisses wird das XML gelesen und ausgewertet. Leider hat der Server dann schon ein schlichtes 200 - OK gesendet und die Session ist beendet.

WIE speicherst du die XML-Datei?
Falls du ein TFileStream-Objekt benutzt, ist zu beachten, dass die Datei solange zum Schreiben geöffnet ist, bis das TFileStream-Objekt gefree'd wird.

FrankBrin 8. Mär 2005 10:10

Re: TIdHttpServer und XML
 
Danke für den schnellen Tip,
doch ich mach das ganz unkonventionell!

Ich hole mir die Daten im OnCommandGet via TStringStream. Das sieht dann so aus:

myData := (aRequestInfo.PostStream AS TStringStream).DataString;

Dazu habe ich beim HTTP-Server an das Ereignis OnCreatePostStream die folgende Prozedur gehängt:

procedure TFrmMain.myHTTPServerCreatePostStream(ASender: TIdPeerThread;
var VPostStream: TStream);
begin
VPostStream := TStringStream.Create('');
end; //================================================== ======================

Die Daten in myData speichere ich mit der folgenden Prozedure

procedure TFrmMain.SaveDataToFile( filename: String; data: String);
var f : TextFile;
begin
AssignFile( f, filename);
Rewrite( f);
Write( f, data);
CloseFile( f);
end; //================================================== ======================

Also eigentlich nichts was noch nicht geschlossen ist! Oder siehst Du in dem VPostStream ein Problem?

shmia 8. Mär 2005 10:44

Re: TIdHttpServer und XML
 
Zitat:

Zitat von FrankBrin
Also eigentlich nichts was noch nicht geschlossen ist! Oder siehst Du in dem VPostStream ein Problem?

Das sieht mal soweit in Ordnung aus.
Ich würde allerdings so speichern:
(die procedure ist "moderner" und eleganter)
Delphi-Quellcode:
procedure StringToFile(const FileName, Contents: AnsiString);
var
  fs: TFileStream;
  len: Integer;
begin
  fs := TFileStream.Create(FileName, fmCreate);
  try
    len := Length(Contents);
    if len > 0 then
      fs.WriteBuffer(Contents[1], Length(Contents));
  finally
    fs.Free;
  end;
end;
Später (wenn alles klappt) kannst du dann [TStream].CopyFrom benützen, ohne Umweg über einen String.
Das Nächste, was du prüfen musst, ist der Dateiname der gespeicherten XML-Datei.
Du weisst: ein falscher Buchstabe (oder fehlender Backslash) im Dateiname und die Datei kann nicht geöffnet werden.
Deshalb würde ich zuerst mal die Existens der Datei abfragen, bevor mit TXMLDocument geöffnet wird.
Delphi-Quellcode:
if not FileExists(xmldatei) then
begin
   // Mitteilung verschicken oder Eintrag in Logdatei
   ...
end;

FrankBrin 8. Mär 2005 16:30

Re: TIdHttpServer und XML
 
Nee, das hilft auch nix.

Leider komme ich erst jetzt dazu, Deinen Tipp auszuprobieren. Der Dateiname beim Öffnen stimmt. Doch das TXMLDocument weigert sich weiterhin beharrlich, die Datei zu öffnen.

:?: Ja vielleicht geht das Ganze auch ohne es in eine Datei zu schreiben. So "einfach den Stream ans XML" umleiten. Kennt sich jemand damit aus oder weiss ein gutes Beispiel. :mrgreen:

Gruß
FrankBrin


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz