Kann ich den TIdHttpServer auch in Form eines Web Services nutzen ?
Der Web Service soll hinterher auf einem Apache laufen.
Ja, man kann mit TIdHTTPServer auch ohne weiteres einen Web Service bauen. Dazu muss nur eine Methode implementiert werden, in der man auf den Stream des POST Requests zugreifen kann (siehe unten).
Ein TIdHTTPServer ist aber so wie der Apache HTTP Server ein eigenständiger
TCP Server. Wenn man ihn mit einem bestehenden Apache verwenden will, dann ist die einfachste Möglichkeit den Apache als Reverse Proxy zu konfigurieren. Der Apache Server leitet dann externe Anfragen an den in Delphi geschriebenen Web Service weiter. Meist genügen dafür ein paar Zeilen in der Apache Konfiguration
Code:
...
ProxyRequests Off
ProxyPass /service http://
localhost:8080/service/
ProxyPassReverse /service http://
localhost:8080/service/
...
Der Apache kann dann parallel auch andere HTTP Requests bearbeiten, z.B. PHP oder statische Dokumente. Nur die Requests an den Web Service werden an die Delphi Anwendung 'delegiert'.
Die vom Client per POST gesendeten Stream Daten stehen in der PostStream Property des ARequestInfo Parameters des TIdHTTPServer Eventhandler.
Wenn man die Komponente zur Designzeit erzeugt hat und den OnCommandGet EventHandler anklickt, kann man den automatisch erzeugten Sourcecode um die eigene Behandlung ergänzen.
Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
ReceivedStream: TStream;
begin
// weise den Stream meiner temporären Variable zu
ReceivedStream := ARequestInfo.PostStream;
// verwende den Stream
...
// Freigeben des Streams ist nicht notwendig, der Stream wird von Indy freigegeben
// xxxStream.Free;
end;
Anstatt den HTTP Server zur Designzeit zu erzeugen kann man ihn auch dynamisch - zur Laufzeit - erstellen. Man benötigt dann nicht mehr die Forms und andere Teile der
VCL, was die Web Service Anwendung kleiner macht.