Services Web avec Ruby - SOAP4R

Qu'est-ce que SOAP?

Le protocole SOAP (Simple Object Access Protocol) est un protocole RPC multiplateforme et indépendant du langage basé sur XML et, généralement (mais pas nécessairement) HTTP.

Il utilise XML pour coder les informations qui effectuent l'appel de procédure à distance et HTTP pour transporter ces informations sur un réseau des clients aux serveurs et vice versa.

SOAP présente plusieurs avantages par rapport à d'autres technologies comme COM, CORBA, etc.: par exemple, ses coûts de déploiement et de débogage relativement bon marché, son extensibilité et sa facilité d'utilisation, et l'existence de plusieurs implémentations pour différents langages et plates-formes.

Veuillez vous référer à notre simple tutoriel SOAP pour le comprendre en détail.

Ce chapitre vous familiarise avec l'implémentation SOAP pour Ruby (SOAP4R). Il s'agit d'un didacticiel de base, donc si vous avez besoin d'un détail approfondi, vous devrez vous référer à d'autres ressources.

Installation de SOAP4R

SOAP4R est l'implémentation SOAP pour Ruby développée par Hiroshi Nakamura et peut être téléchargée depuis -

NOTE - Il se peut que vous ayez déjà installé ce composant.

Download SOAP

Si vous connaissez gem utilitaire, vous pouvez utiliser la commande suivante pour installer SOAP4R et les packages associés.

$ gem install soap4r --include-dependencies

Si vous travaillez sous Windows, vous devez télécharger un fichier compressé à partir de l'emplacement ci-dessus et l'installer à l'aide de la méthode d'installation standard en exécutant ruby install.rb .

Ecriture de serveurs SOAP4R

SOAP4R prend en charge deux types de serveurs différents -

  • Basé sur CGI / FastCGI (SOAP :: RPC :: CGIStub)
  • Autonome (SOAP :: RPC: StandaloneServer)

Ce chapitre donne des détails sur l'écriture d'un serveur autonome. Les étapes suivantes sont impliquées dans l'écriture d'un serveur SOAP.

Étape 1 - Hériter de la classe SOAP :: RPC :: StandaloneServer

Pour implémenter votre propre serveur autonome, vous devez écrire une nouvelle classe, qui sera l'enfant de SOAP :: StandaloneServer comme suit -

class MyServer < SOAP::RPC::StandaloneServer
  ...............
end

NOTE- Si vous souhaitez écrire un serveur basé sur FastCGI, vous devez prendre SOAP :: RPC :: CGIStub comme classe parent, le reste de la procédure restera le même.

Étape 2 - Définir les méthodes du gestionnaire

La deuxième étape consiste à écrire vos méthodes de services Web, que vous souhaitez exposer au monde extérieur.

Ils peuvent être écrits comme de simples méthodes Ruby. Par exemple, écrivons deux méthodes pour ajouter deux nombres et diviser deux nombres -

class MyServer < SOAP::RPC::StandaloneServer
   ...............

   # Handler methods
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

Étape 3 - Exposez les méthodes du gestionnaire

La prochaine étape consiste à ajouter nos méthodes définies à notre serveur. La méthode initialize est utilisée pour exposer les méthodes de service avec l'une des deux méthodes suivantes -

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, methodName, *paramArg)
   end
end

Voici la description des paramètres -

N ° Sr. Paramètre et description
1

receiver

Objet qui contient la méthode methodName. Vous définissez les méthodes de service dans la même classe que la méthode methodDef, ce paramètre est self .

2

methodName

Le nom de la méthode appelée en raison d'une requête RPC.

3

paramArg

Spécifie, lorsqu'ils sont donnés, les noms des paramètres et les modes de paramètres.

Pour comprendre l'utilisation des paramètres inout ou out , considérez la méthode de service suivante qui prend deux paramètres (inParam et inoutParam), renvoie une valeur de retour normale (retVal) et deux autres paramètres: inoutParam et outParam -

def aMeth(inParam, inoutParam)
   retVal = inParam + inoutParam
   outParam = inParam . inoutParam
   inoutParam = inParam * inoutParam
   return retVal, inoutParam, outParam
end

Maintenant, nous pouvons exposer cette méthode comme suit -

add_method(self, 'aMeth', [
   %w(in inParam),
   %w(inout inoutParam),
   %w(out outParam),
   %w(retval return)
])

Étape 4 - Démarrez le serveur

La dernière étape consiste à démarrer votre serveur en instanciant une instance de la classe dérivée et en appelant start méthode.

myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)

myServer.start

Voici la description des paramètres requis -

N ° Sr. Paramètre et description
1

ServerName

Un nom de serveur, vous pouvez donner ce que vous aimez le plus.

2

urn:ruby:ServiceName

Ici urn: ruby est constant mais vous pouvez donner un nom ServiceName unique pour ce serveur.

3

hostname

Spécifie le nom d'hôte sur lequel ce serveur écoutera.

4

port

Un numéro de port disponible à utiliser pour le service Web.

Exemple

Maintenant, en utilisant les étapes ci-dessus, écrivons un serveur autonome -

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

Lorsqu'elle est exécutée, cette application serveur démarre un serveur SOAP autonome sur localhost et écoute les requêtes sur le port 8080. Elle expose une méthode de service, add et div , qui prend deux paramètres et renvoie le résultat.

Maintenant, vous pouvez exécuter ce serveur en arrière-plan comme suit -

$ ruby MyServer.rb&

Ecriture de clients SOAP4R

La classe SOAP :: RPC :: Driver fournit la prise en charge de l'écriture d'applications client SOAP. Ce chapitre décrit cette classe et montre son utilisation sur la base d'une application.

Voici les informations minimales dont vous auriez besoin pour appeler un service SOAP -

  • L'URL du service SOAP (URL du point de terminaison SOAP).
  • L'espace de noms des méthodes de service (URI d'espace de noms de méthode).
  • Les noms des méthodes de service et leurs paramètres.

Maintenant, nous allons écrire un client SOAP qui appellerait les méthodes de service définies dans l'exemple ci-dessus, nommées add et div .

Voici les principales étapes pour créer un client SOAP.

Étape 1 - Créer une instance de pilote SOAP

Nous créons une instance de SOAP :: RPC :: Driver en appelant sa nouvelle méthode comme suit -

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

Voici la description des paramètres requis -

N ° Sr. Paramètre et description
1

endPoint

URL du serveur SOAP avec lequel se connecter.

2

nameSpace

L'espace de noms à utiliser pour tous les RPC réalisés avec cet objet SOAP :: RPC :: Driver.

3

soapAction

Une valeur pour le champ SOAPAction de l'en-tête HTTP. Si nul, la valeur par défaut est la chaîne vide "".

Étape 2 - Ajouter des méthodes de service

Pour ajouter une méthode de service SOAP à un SOAP :: RPC :: Driver, nous pouvons appeler la méthode suivante en utilisant l' instance SOAP :: RPC :: Driver -

driver.add_method(name, *paramArg)

Voici la description des paramètres -

N ° Sr. Paramètre et description
1

name

Le nom de la méthode de service Web distant.

2

paramArg

Spécifie les noms des paramètres des procédures distantes.

Étape 3 - Appeler le service SOAP

La dernière étape consiste à facturer le service SOAP à l'aide de l' instance SOAP :: RPC :: Driver comme suit -

result = driver.serviceMethod(paramArg...)

Ici, serviceMethod est la méthode de service Web réelle et paramArg ... les paramètres de liste nécessaires pour transmettre la méthode de service.

Example

Sur la base des étapes ci-dessus, nous écrirons un client SOAP comme suit -

#!/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

Lectures supplémentaires

Je vous ai expliqué juste des concepts très basiques des services Web avec Ruby. Si vous souhaitez approfondir votre recherche, vous trouverez le lien suivant pour obtenir plus de détails sur les services Web avec Ruby .