![]() |
Einen REST-Server mit Delphi/CPP Builder erstellen?
Vorweg: Mein "Wissen" zu "REST" beschränkt sich auf "Über HTTP sendet ein Client einen Befehls-String wie GET oder PUT, gefolgt von einem JSON-Datenblock. Zurück bekommt er ebenfalls einen JSON-Datenblock".
Ich möchte einen Windows-Dienst erstellen der REST-Anforderungen entgegennimmt, darauf hin etwas ausführt und nur zu antworten braucht "Ging" oder "Ging nicht". Ich sehe, mit XE7, nur Rest Client-Komponenten: Ich kann einen Server ansprechen und dessen Antwort ziemlich komfortabel auswerten. Ich möchte nun aber nicht Client sein, ich möchte der Server sein. Welche Optionen stehen mir offen? Ich sehe unter Datei -> Neu nur die Möglichkeit eines DataSnap-Servers. Das schießt aber doch etwas über das Ziel hinaus, zumal der nur Deployment-Möglichkeiten wie irgendwelche Apache-Webserver-Module bietet. Ist das doch der angedachte (oder einzige) Weg oder gibt es andere Möglichkeiten (ohne wieder etwas dazu kaufen zu müssen)? |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Da ein REST-Server ist nichts anderes ist als ein HTTP-Server kann man den ganz simpel mit
![]() Persönlich nehme ich dafür ein Apache mit PHP und einem PHP-REST-Framework. Damit bin ich dann flexibel, worauf dieser Server laufen kann (Windows, OSX, Linux, ...). |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Der Client müsste auch bei der Pro dabei sein, aber Server (DataSnap) erst in der großen Version.
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Aber ein Http Server macht mit ein Paar Zeilen das "richtige" |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Zitat:
Alternativ könnte ich mich auch auf meinen Hintern setzen und selbst danach suchen... |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Nö, da ist nix mit wilden Headern (nur wenn du willst)
Du hast doch den REST-Debugger (über Tools). Klatsch dir die HTTP-Server Komponente auf die Form, verdrahte dir die beiden Events wo du die Requests verarbeitest und schau dort nach, was da ankommt, wenn du mit dem REST-Debugger dort etwas hinschickst. Es ist nur soviel, wie du da auch hinschickst ;) |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Die Enterprise Edition kann DataSnap Server erstellen und damit geht das sehr einfach. Das hat auch den Vorteil, dass man keine 3rd-Party Komponenten benötigt.
Von der Geschwindigkeit her sah es in Tests bei vielen Anfragen oder Clients allerdings schlechter aus als manche anderen Frameworks. Wir setzen DataSnap mittlerweile allerdings intensiv und ohne Probleme auch mit hunderten von Clients ein inkl. hin- und herschicken von großen Streams usw., da sehe ich hinsichtlich REST erst einmal weniger Probleme. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Geschwindigkeit und Enterprise-Versionen sind kein Problem. Allerdings sehe ich keine Möglichkeit, das einfach als Wi dows-Dienst zu realisieren: Apache, IIS, Standalone-exe. Das passt doch alles nicht (oder?)
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Guten Morgen,
TidHttpServer in einen Dienst packen und gut ist - wo ist das Problem? Warum soll das nicht als Dienst funktionieren? Das ist im Grunde auch nix anderes als eine "standalone-exe" die in einem besonderen Kontext ausgeführt wird.... Oder Du nimmst z.B. die hier: ![]() |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Das muss man manuell ändern, aber dafür musst du nur einen einfachen Dienst erstellen und dessen Code übernehmen. Die DataSnap Module sind alle als Datenmodule usw. gekapselt, so dass die Ansteuerung als VCL-Anwendung oder als Dienst identisch ist. Bei Bedarf kann ich zu dem Thema auch noch mehr zeigen, wenn du möchtest, aber das schaffe ich vermutlich erst am Wochenende. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Zitat:
![]() Und ich denke so einige hier auch nicht. :thumb: |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Und vor allem nicht schön finde ich. Ich schaue mal, dass ich dazu komme, meine Lösung zu posten. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Die Magie ist in der DPR zu finden
Delphi-Quellcode:
Die EXE mit dem Parameter -g oder --gui gestartet, zeigt eben die VCL-Anwendung, ansonsten reagiert die Anwendung wie ein Service.
program ServiceWithGui;
uses Vcl.Forms, Vcl.SvcMgr, System.SysUtils, Service.Main in 'Service.Main.pas' {MainService: TService}, Form.Main in 'Form.Main.pas' {MainForm}, Data.Main in 'Data.Main.pas' {MainData: TDataModule}; {$R *.RES} function IsService: Boolean; begin Result := not( FindCmdLineSwitch( 'g', [ '-' ], true ) or FindCmdLineSwitch( '-gui', [ '-' ], false ) ); end; begin if IsService then begin if not Vcl.SvcMgr.Application.DelayInitialize or Vcl.SvcMgr.Application.Installing then Vcl.SvcMgr.Application.Initialize; Vcl.SvcMgr.Application.CreateForm( TMainService, MainService ); Vcl.SvcMgr.Application.CreateForm( TMainData, MainData ); Vcl.SvcMgr.Application.Run; end else begin Vcl.Forms.Application.Initialize( ); Vcl.Forms.Application.CreateForm( TMainForm, MainForm ); Vcl.Forms.Application.CreateForm( TMainData, MainData ); Vcl.Forms.Application.Run( ); end; end. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Ich poste gleich das Beispiel. Die Kommandozeilenparameter sind dann doch sehr umständlich... ich bin einfach nicht dazu gekommen bisher.
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Ja, aber dein Beispiel ist durchaus gern gesehen ... meins habe ich auch nur gepostet, weil von dir noch nichts kam :-P |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
So, hier kommt nun endlich das Beispiel.
Kernstück ist das hier:
Delphi-Quellcode:
Sprich der Trick an der Sache ist, dass ich nachschaue, ob der Dienstmanager mein Programm gestartet hat oder der Dienst gerade installiert oder deinstalliert werden soll. Zusätzlich habe ich als Demo mal noch einen Konfigurationsswitch eingebaut.
var
VclApplication: TApplication; ServiceApplication: TServiceApplication; begin if WebRequestHandler <> nil then WebRequestHandler.WebModuleClass := TLogServerDataModule; if FindCmdLineSwitch('config') then // normal application with config dialog only begin VclApplication := Vcl.Forms.Application; VclApplication.Initialize; VclApplication.MainFormOnTaskbar := True; VclApplication.CreateForm(TfrmLogServerConfigDlg, frmLogServerConfigDlg); VclApplication.Run; end else if not AnsiSameText(GetParentProcessName, 'services.exe') and not FindCmdLineSwitch('install') and not FindCmdLineSwitch('uninstall') then // normal application begin VclApplication := Vcl.Forms.Application; VclApplication.Initialize; VclApplication.MainFormOnTaskbar := True; VclApplication.CreateForm(TfrmLogServerTestMain, frmLogServerTestMain); VclApplication.CreateForm(TLogServerDataModule, LogServerDataModule); LogServerDataModule.RunningAsService := False; VclApplication.Run; end else // service begin ServiceApplication := Vcl.SvcMgr.Application; if not ServiceApplication.DelayInitialize or ServiceApplication.Installing then ServiceApplication.Initialize; ServiceApplication.CreateForm(TDemoServer, DemoServer); ServiceApplication.CreateForm(TLogServerDataModule, LogServerDataModule); LogServerDataModule.RunningAsService := True; ServiceApplication.Run; end; |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Danke Jaenicke und Sir Rufo.
Man lernt immer wieder was dazu. Ich hatte mir das ganze um einiges komplizierter vorgestellt, aber wenn ich die Beispiele lese ist es ja doch ganz simpel. Kommt mir auch sehr gelegen, da ich eh grad an einem Service rumstricke, und mir schon Gedanken über ein Konfigurationsprogramm gemacht habe. Das kann ich mir jetzt sparen und gleich mit in die Exe packen, was nicht nur eleganter aussieht, sondern auch die Notwendigkeit beinhaltet, dass der Dienst zur Übernahme der Konfiguration eh neu gestartet werden müsste. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Vor allem kann man den Dienst so auch steuern, wenn man ihn als Exe normal aufruft. (In der Demo steckt noch mehr als hier als Quelltext gepostet ist, falls das jemand sonst nicht ausprobiert. ;-)) Außerdem habe ich in einem unserer echten Dienste im Büro auch gleich Eingabefelder für Name und Anzeigename des Dienstes für dessen Installation und Statusprüfung eingebaut, was man sonst ja nicht so einfach einstellen kann.
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe per PN die Nachricht bekommen, dass in dem Download noch Units fehlen. Hier der korrigierte Download, in dem diese Units nicht benötigt werden.
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
ahh. genial, danke @jaenicke
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Angenommen es geht was bei Initialisierung des Prozesses schief (Datenbank nicht erreichbar, Ports belegt, etc), wie geht Ihr da vor? Last Ihr den Prozess am Leben und protokolliert das ganze oder Prozess beenden mit Application.Terminate und vor dem .Run rausspringen?
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Das wichtigste ist natürlich das zu loggen. Bei einem Dienst auch im System-Eventlog.
Dann würde ich bei einem Dienst per Datasnap auch eine Statuswebseite anbieten. Dort kann dann der Fehler im Detail stehen und auf der Startseite der verlinkte Hinweis, dass der Dienst nicht initialisiert werden konnte. Bei einer normalen Anwendung sehe ich im Normalfall keinen Grund diese normal zu starten, aber wenn diese wie im Beispiel den Dienst steuert, würde ich diese trotzdem starten, ggf. direkt mit einem speziellen Fenster dafür. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hinweis am Rande: Am 2. bzw. 4. Februar macht Embarcadero einen Skill Sprint zu "Developing REST Servers from scratch"
![]() |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Ich stehe vor einer ähnlichen Aufgabe und bin irgendwie auf dem gedanklichen Holzweg, wenn es darum geht die eigene Applikation auf REST-Befehle responsiv zu gestalten. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Ganz billig. Wenn du ein, zwei Tage warten kannst such ich das nochmal heraus. Im Endeffekt war es einfach nur auf den HTTP-GET-String geschaut, eine dazu passende Behandler-Methode aufgerufen und die über HTTP übergebenen Params (sowie die Rückgaben) waren halt Json-Objekte. Mehr habe ich nicht gebraucht.
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Du brauchst semantisch korrekten Support für GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, CONNECT und TRACE. Du brauchst korrektes Handling von Cache-Headern. Du brauchst vor allem HATEOAS, und das ist definitiv nicht mehr 'billig', geschweige denn noch irgendwie Trivial. Ein RMM Level 0 wäre billig, aber das ist dann kein REST. Dann reden wir maximal von einer 'HTTP-(GET oder POST) API'. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Eben. 2/3 deiner Abkürzungen höre ich zum ersten mal. Deshalb war meine Lösung billig, sprich: Unvollständig. Für mein Szenario hat es gereicht.
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Nur ist es dann halt kein REST, sondern was anderes (eben meist eine HTTP-Api) ;-) Ich finde es schon wichtig, dass man die Sachen einfach beim korrekten Namen nennt. Ich sag ja auch ned "Datenbank" wenn ich eine Speicherung in CSV-Files meine ;-) |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
|
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Ich bin zwar jetzt drei Schritte weiter, aber vielleicht kann ich trotzdem was mitnehmen. Nachdem ich gestern Nachmittag verzweifelt und erfolglos versucht habe, an unseren bestehenden DataSnap-Server eine TDRESTWebDispatcher-Komponente zu knüppeln, habe ich diesen Thread gefunden. Leider ging gar nix, es kam nichts an im OnCommandGet-Handler der TidHTTPServer-Instanz. Heute morgen fahre ich den Rechner hoch und siehe da: sowohl per Browser als auch per RESTDebugger kann ich den Indy-Server ansprechen und der OnCommandGet-Handler wird aufgerufen... Manchmal muss man einfach nur neustarten! :shock: |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Plötzlich gibt es auch kein "Rechts" und "Links" mehr... Sondern ab diesen Zeitpunkt ist es "cool" es Backbord oder Steuerbord zu nennen... Genau wie vorne und hinten...:stupid: Ich bin ganz bei Dir... Mein Szenario ist auch so... OK, mein FRS (Firemonkey-REST-Server) macht REST und nicht nur eine Http-Get API, aber selbst wenn... Dem Kunden ist das egal... Für Ihn muss es nur laufen... Mavarik |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Zitat:
Natürlich musst Du die fachlichen Anforderungen erfüllen, aber wenn Dein Datenmodell beispielsweise kein Löschen vorsieht, sollte die Zeit, die Du in die Implementation von "DELETE" steckst, überschaubar bleiben. REST schreibt ausdrücklich nicht vor, dass alle Methoden zu implementieren sind. Ein REST-Service, der nur HTTP-GET implementiert, trägt den Namen REST trotz allem völlig zu Recht. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Wenn ich den Wikipedia-Artikel richtig verstanden habe könnte man soger sagen, dass eine schnöde statische Webseite REST erfüllt.
Wobei es ja scheinbar gerade die Kunst ist bei nicht statischen, sondern dynamischen Inhalten REST zu bleiben. |
AW: Einen REST-Server mit Delphi/CPP Builder erstellen?
Der Vollständigkeit halber wollte ich einmal
Das "delphimvcframework" vom guten Daniele Teti erwähnen:
Ich habe nun einen Anwendungsfall wo ich etwas "mehr" brauche. Statt mir den Kram mit einem TIdHttpServer selbst zu basteln habe ich mir nun mal das delphimvcframework angeschaut. Nach den ersten paar Minuten im Einsatz macht das einen fantastischen Eindruck. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:58 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 by Thomas Breitkreuz