Webdienste mit Ruby - SOAP4R
Was ist Seife?
Das Simple Object Access Protocol (SOAP) ist ein plattformübergreifendes und sprachunabhängiges RPC-Protokoll, das auf XML und normalerweise (aber nicht unbedingt) HTTP basiert.
Es verwendet XML, um die Informationen zu codieren, die den Remoteprozeduraufruf ausführen, und HTTP, um diese Informationen über ein Netzwerk von Clients zu Servern und umgekehrt zu transportieren.
SOAP bietet gegenüber anderen Technologien wie COM, CORBA usw. mehrere Vorteile: Zum Beispiel die relativ günstigen Bereitstellungs- und Debugging-Kosten, die Erweiterbarkeit und Benutzerfreundlichkeit sowie das Vorhandensein mehrerer Implementierungen für verschiedene Sprachen und Plattformen.
Weitere Informationen finden Sie in unserem einfachen Tutorial SOAP .
Dieses Kapitel macht Sie mit der SOAP-Implementierung für Ruby (SOAP4R) vertraut. Dies ist ein grundlegendes Tutorial. Wenn Sie also ein detailliertes Detail benötigen, müssen Sie auf andere Ressourcen verweisen.
SOAP4R installieren
SOAP4R ist die von Hiroshi Nakamura entwickelte SOAP-Implementierung für Ruby und kann heruntergeladen werden von -
NOTE - Möglicherweise haben Sie diese Komponente bereits installiert.
Download SOAP
Wenn Sie sich dessen bewusst sind gem Dienstprogramm, dann können Sie den folgenden Befehl verwenden, um SOAP4R und verwandte Pakete zu installieren.
$ gem install soap4r --include-dependencies
Wenn Sie unter Windows arbeiten, müssen Sie eine komprimierte Datei vom oben genannten Speicherort herunterladen und mithilfe der Standardinstallationsmethode installieren, indem Sie ruby install.rb ausführen .
Schreiben von SOAP4R-Servern
SOAP4R unterstützt zwei verschiedene Servertypen -
- CGI / FastCGI-basiert (SOAP :: RPC :: CGIStub)
- Standalone (SOAP :: RPC: StandaloneServer)
Dieses Kapitel enthält Einzelheiten zum Schreiben eines eigenständigen Servers. Die folgenden Schritte sind beim Schreiben eines SOAP-Servers erforderlich.
Schritt 1 - SOAP :: RPC :: StandaloneServer-Klasse erben
Um Ihren eigenen eigenständigen Server zu implementieren, müssen Sie eine neue Klasse schreiben, die SOAP :: StandaloneServer wie folgt untergeordnet ist:
class MyServer < SOAP::RPC::StandaloneServer
...............
end
NOTE- Wenn Sie einen FastCGI-basierten Server schreiben möchten, müssen Sie SOAP :: RPC :: CGIStub als übergeordnete Klasse verwenden. Der Rest der Prozedur bleibt unverändert .
Schritt 2 - Handlermethoden definieren
Der zweite Schritt besteht darin, Ihre Web Services-Methoden zu schreiben, die Sie der Außenwelt zugänglich machen möchten.
Sie können als einfache Ruby-Methoden geschrieben werden. Schreiben wir zum Beispiel zwei Methoden, um zwei Zahlen hinzuzufügen und zwei Zahlen zu teilen -
class MyServer < SOAP::RPC::StandaloneServer
...............
# Handler methods
def add(a, b)
return a + b
end
def div(a, b)
return a / b
end
end
Schritt 3 - Handlermethoden verfügbar machen
Der nächste Schritt besteht darin, unsere definierten Methoden zu unserem Server hinzuzufügen. Die Initialisierungsmethode wird verwendet, um Dienstmethoden mit einer der beiden folgenden Methoden verfügbar zu machen:
class MyServer < SOAP::RPC::StandaloneServer
def initialize(*args)
add_method(receiver, methodName, *paramArg)
end
end
Hier ist die Beschreibung der Parameter -
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | receiver Das Objekt, das die Methode methodName enthält. Sie definieren die Servicemethoden in derselben Klasse wie die methodDef-Methode. Dieser Parameter ist self . |
2 | methodName Der Name der Methode, die aufgrund einer RPC-Anforderung aufgerufen wird. |
3 | paramArg Gibt, wenn angegeben, die Parameternamen und Parametermodi an. |
Um die Verwendung von Inout- oder Out- Parametern zu verstehen , betrachten Sie die folgende Dienstmethode, die zwei Parameter (inParam und inoutParam) verwendet, einen normalen Rückgabewert (retVal) und zwei weitere Parameter zurückgibt : inoutParam und outParam -
def aMeth(inParam, inoutParam)
retVal = inParam + inoutParam
outParam = inParam . inoutParam
inoutParam = inParam * inoutParam
return retVal, inoutParam, outParam
end
Jetzt können wir diese Methode wie folgt verfügbar machen:
add_method(self, 'aMeth', [
%w(in inParam),
%w(inout inoutParam),
%w(out outParam),
%w(retval return)
])
Schritt 4 - Starten Sie den Server
Der letzte Schritt besteht darin, Ihren Server zu starten, indem Sie eine Instanz der abgeleiteten Klasse instanziieren und aufrufen start Methode.
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)
myServer.start
Hier ist die Beschreibung der erforderlichen Parameter -
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | ServerName Mit einem Servernamen können Sie angeben, was Ihnen am besten gefällt. |
2 | urn:ruby:ServiceName Hier Urne: Ruby ist konstant, aber Sie können diesem Server einen eindeutigen ServiceName-Namen geben. |
3 | hostname Gibt den Hostnamen an, den dieser Server abhört. |
4 | port Eine verfügbare Portnummer, die für den Webdienst verwendet werden soll. |
Beispiel
Lassen Sie uns nun mit den obigen Schritten einen eigenständigen Server schreiben -
require "soap/rpc/standaloneserver"
begin
class MyServer < SOAP::RPC::StandaloneServer
# Expose our services
def initialize(*args)
add_method(self, 'add', 'a', 'b')
add_method(self, 'div', 'a', 'b')
end
# Handler methods
def add(a, b)
return a + b
end
def div(a, b)
return a / b
end
end
server = MyServer.new("MyServer",
'urn:ruby:calculation', 'localhost', 8080)
trap('INT){
server.shutdown
}
server.start
rescue => err
puts err.message
end
Bei der Ausführung startet diese Serveranwendung einen eigenständigen SOAP-Server auf localhost und wartet auf Anforderungen auf Port 8080. Sie macht eine Dienstmethode verfügbar, add und div , die zwei Parameter verwendet und das Ergebnis zurückgibt.
Jetzt können Sie diesen Server wie folgt im Hintergrund ausführen:
$ ruby MyServer.rb&
Schreiben von SOAP4R-Clients
Die SOAP :: RPC :: Driver- Klasse bietet Unterstützung für das Schreiben von SOAP-Clientanwendungen. Dieses Kapitel beschreibt diese Klasse und demonstriert ihre Verwendung anhand einer Anwendung.
Im Folgenden finden Sie die Mindestinformationen, die Sie zum Aufrufen eines SOAP-Dienstes benötigen würden:
- Die URL des SOAP-Dienstes (SOAP-Endpunkt-URL).
- Der Namespace der Dienstmethoden (Method Namespace URI).
- Die Namen der Dienstmethoden und ihre Parameter.
Jetzt schreiben wir einen SOAP-Client, der die im obigen Beispiel definierten Dienstmethoden add und div aufruft .
Hier sind die wichtigsten Schritte zum Erstellen eines SOAP-Clients.
Schritt 1 - Erstellen Sie eine SOAP-Treiberinstanz
Wir erstellen eine Instanz von SOAP :: RPC :: Driver, indem wir die neue Methode wie folgt aufrufen:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
Hier ist die Beschreibung der erforderlichen Parameter -
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | endPoint URL des SOAP-Servers, mit dem eine Verbindung hergestellt werden soll. |
2 | nameSpace Der Namespace, der für alle RPCs verwendet werden soll, die mit diesem SOAP :: RPC :: Driver-Objekt erstellt wurden. |
3 | soapAction Ein Wert für das SOAPAction-Feld des HTTP-Headers. Wenn nil, wird standardmäßig die leere Zeichenfolge "" verwendet. |
Schritt 2 - Hinzufügen von Servicemethoden
Um eine SOAP - Service - Methode zu einem hinzufügen SOAP :: RPC :: Treiber können wir rufen Sie das folgende Verfahren unter Verwendung von SOAP :: RPC :: Treiber - Instanz -
driver.add_method(name, *paramArg)
Hier ist die Beschreibung der Parameter -
Sr.Nr. | Parameter & Beschreibung |
---|---|
1 | name Der Name der Remote-Webdienstmethode. |
2 | paramArg Gibt die Namen der Parameter der Remoteprozeduren an. |
Schritt 3 - Rufen Sie den SOAP-Dienst auf
Der letzte Schritt besteht darin, den SOAP-Service mithilfe der SOAP :: RPC :: Driver- Instanz wie folgt in Rechnung zu stellen :
result = driver.serviceMethod(paramArg...)
Hier serviceMethod ist die eigentliche Web - Service - Methode und paramArg ... die Liste erforderlichen Parameter in der Service - Methode zu übergeben.
Example
Basierend auf den obigen Schritten schreiben wir einen SOAP-Client wie folgt:
#!/usr/bin/ruby -w
require 'soap/rpc/driver'
NAMESPACE = 'urn:ruby:calculation'
URL = 'http://localhost:8080/'
begin
driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
# Add remote sevice methods
driver.add_method('add', 'a', 'b')
# Call remote service methods
puts driver.add(20, 30)
rescue => err
puts err.message
end
Weitere Lesungen
Ich habe Ihnen nur sehr grundlegende Konzepte von Web Services mit Ruby erklärt. Wenn Sie einen weiteren Drilldown durchführen möchten, finden Sie unter folgendem Link weitere Informationen zu Webdiensten mit Ruby .