Home » Tutorials » Netzwerk und Internet » Webservices

Webservices

Interface

Wie bereits erwähnt, muss die Funktion ja auch nach außen sichtbar sein, damit man den Webservice überhaupt als solchen benutzen kann. Dazu müssen wir den Funktionskopf noch in das Interface aufnehmen. Wechseln wir also in die Unit MeinWebServiceIntf.

{ Invokable-Interfaces müssen von IInvokable abgeleitet sein }
 IMeinWebservice = interface(IInvokable)
 ['{43840624-05BA-45E5-AB9A-0A339E403E45}']

{ Methoden des Invokable-Interface dürfen nicht die Standard- }
{ Aufrufkonvention benutzen; stdcall wird empfohlen }
function GetMWSt(const Brutto: Double): Double; stdcall;
end;

Die rot hervorgehobene Zeile (unser Funktionskopf) muss in das Interface eingefügt werden.

Nun speichern wir alle Dateien des Projekts (Umsch+Strg+S) – am einfachsten unter den vorgeschlagenen Namen. Anschließend können wir den Compilier-Vorgang starten (Strg+F9), und erhalten die Datei Project1.exe.

Bevor wir uns anschauen, was wir mit dieser EXE machen können, werfen wir aber noch einen Blick auf den Quellcode.
Den Inhalt von Unit1 haben wir bereits im Zusammenhang mit dem WebModul betrachtet.
In den beiden übrigen Units befindet sich allerdings noch Code, den wir bisher einfach geflissentlich übersehen haben.

In der Unit MeinWebServiceIntf sind dies das Invokable Interface und der initialization-Abschnitt. Beginnen wir mit dem Interface: Übersetzt man die Bezeichnung „Invokable Interface“ auf deutsch, verliert sie schon einen Teil ihres Schreckens. „Aufrufbare Schnittstelle“ bedeutet das nämlich. Schnittstellen werden in Delphi ähnlich wie Klassen deklariert. Statt class wird jedoch das Schlüsselwort interface verwendet. Außer, dass es sich um das gleiche Wort handelt, hat dieses Interface nichts mit dem Interface einer Unit zu tun!
Der Aufbau einer Schnittstelle sieht allgemein so aus:

type
 Schnittstellenname = interface (Vorfahrschnittstelle)
 ['{GUID}']
 Elementliste
end;

Im Gegensatz zu Klassen können Schnittstellen zwar Methoden und Eigenschaften, jedoch keine Felder enthalten. Außerdem enthält eine Schnittstelle nur einen public-Teil, da es ja der Sinn einer Schnittstelle ist, öffentlich zugängliche Methoden nach außen bekanntzugeben. Schnittstellen implementieren die aufgeführten Methoden nicht selbst (GetMWSt ist in unserem Beispiel ja eine Methode der Klasse TMeinWebService), und zu ihnen werden auch keine Instanzen gebildet.
Zur eindeutigen Identifikation kann eine Schnittstelle einen global eindeutigen Bezeichner (Global Unique Identifier, GUID) enthalten. Innerhalb der Delphi-IDE können Sie mit der Tastenkombination Strg+Umschalt+G jederzeit einen neuen GUID erzeugen, der weltweit eindeutig ist.
Damit Client-Anwendungen auf die aufrufbare Schnittstelle zugreifen können, muss diese in der Aufrufregistrierung registriert werden. Das geschieht im Initialization-Abschnitt der Unit mit Hilfe der Methode RegisterInterface.

In der Unit MeinWebServiceImpl muss ebenfalls eine Registrierung vorgenommen werden:

 { Invokable-Klassen müssen registriert sein }
 InvRegistry.RegisterInvokableClass(TMeinWebService);

Hierbei handelt es sich jedoch nicht um eine Schnittstelle, sondern um eine „Invokable Class“, eine aufrufbare Klasse.

Weitere, detailliertere Informationen zu Schnittstellen und Registrierungen sind in der Delphi-Hilfe zu finden.