AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TIdHttpServer und XML
Thema durchsuchen
Ansicht
Themen-Optionen

TIdHttpServer und XML

Ein Thema von FrankBrin · begonnen am 8. Mär 2005 · letzter Beitrag vom 8. Mär 2005
Antwort Antwort
FrankBrin

Registriert seit: 8. Mär 2005
Ort: Oppenweiler
105 Beiträge
 
Delphi 2007 Enterprise
 
#1

TIdHttpServer und XML

  Alt 8. Mär 2005, 09:00
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.
Frank Brinschwitz
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: TIdHttpServer und XML

  Alt 8. Mär 2005, 10:04
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.
Andreas
  Mit Zitat antworten Zitat
FrankBrin

Registriert seit: 8. Mär 2005
Ort: Oppenweiler
105 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: TIdHttpServer und XML

  Alt 8. Mär 2005, 11:10
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?
Frank Brinschwitz
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: TIdHttpServer und XML

  Alt 8. Mär 2005, 11:44
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;
Andreas
  Mit Zitat antworten Zitat
FrankBrin

Registriert seit: 8. Mär 2005
Ort: Oppenweiler
105 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: TIdHttpServer und XML

  Alt 8. Mär 2005, 17:30
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.

Gruß
FrankBrin
Frank Brinschwitz
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz