English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Application Web Service SOAP en Ruby4R

Qu'est-ce que SOAP ?

Le protocole d'accès aux objets simples (SOAP, abrégé en Simple Object Access Protocol) est une norme de protocole pour l'échange de données.

SOAP est un protocole simple basé sur XML, qui permet aux applications d'échanger des informations via HTTP.

Le protocole d'accès aux objets simples est une norme de protocole pour l'échange de données, c'est un protocole léger, simple et basé sur XML (un sous-ensemble du langage de balisage général standard), conçu pour échanger des informations structurées et figées sur le WEB.

SOAP4R 安装

SOAP4R 由Hiroshi Nakamura开发实现,用于 Ruby 的 SOAP 应用。

SOAP4R 下载地址:http://raa.ruby-lang.org/project/soap4r/

注意:你的ruby环境可能已经安装了该组件。

Linux 环境下你也可以使用 gem 来安装该组件,命令如下:

gem install soap4r --include-dependencies

如果你是window环境下开发,你需要下载zip压缩文件,并通过执行 install.rb 来安装。

SOAP4R 服务

SOAP4R 支持两种不同的服务类型:

  • 基于 CGI/FastCGI 服务 (SOAP::RPC::CGIStub)

  • 独立服务 (SOAP::RPC:StandaloneServer)

本教程将为大家介绍如何建立独立的 SOAP 服务。步骤如下:

第1步 - 继承SOAP::RPC::StandaloneServer

为了实现自己的独立的服务器,你需要编写一个新的类,该类为 SOAP::RPC::StandaloneServer 的子类:

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

注意:如果你要编写一个基于FastCGI的服务器,那么你需要继承 SOAP::RPC::CGIStub 类,程序的其余部分将保持不变。

Étape 2 - 定义处理方法

接下来我们定义Web Service的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:

class MyServer < SOAP::RPC::StandaloneServer
   .............
 
   # 处理方法
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

Étape 3 - 公布处理方法

接下来添加我们在服务器上定义的方法,initialize方法是公开的,用于外部的连接:

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

以下是各参数的说明:

ParamètresDescription
receiver包含方法名的方法的对象。 如果你在同一个类中定义服务方法,该参数为 self
methodName调用 RPC 请求的方法名。
paramArg参数名和参数模式

为了理解 inoutout 参数,考虑以下服务方法,需要输入两个参数: inParam 和 inoutParam,函数执行完成后返回三个值:retVal、inoutParam 、outParam:

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

Les méthodes d'appel公开es sont les suivantes :

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

Étape 4 - Démarrage du service

Enfin, nous créons une instance de la classe dérivée et appelons la méthode start pour démarrer le service :

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

Voici les instructions pour les paramètres de la requête :

ParamètresDescription
ServerNamenom du service, vous pouvez choisir celui que vous préférez
urn:ruby:ServiceNameIci urn:ruby est fixe, mais vous pouvez donner un nom unique à votre service ServiceName
hostnamespécifier le nom d'hôte
portport du service web

Exemple en ligne

Ensuite, nous créons un service indépendant à l'aide des étapes suivantes :

Exemple en ligne

require "soap/rpc/standaloneserver"
 
begin
   class MyServer < SOAP::RPC::StandaloneServer
 
      # Expose our service
      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

Après l'exécution du programme ci-dessus, un écouteur a été démarré. 808Le service local sur le port 0, et publie deux méthodes : add et div.

Vous pouvez également exécuter ce service en arrière-plan :

$ ruby MyServer.rb &

SOAP4Client R

Développement d'un client SOAP en Ruby en utilisant la classe SOAP::RPC::Driver. Nous allons examiner en détail l'utilisation de la classe SOAP::RPC::Driver.

Pour appeler le service SOAP, il faut les informations suivantes :

  • Adresse URL du service SOAP (SOAP Endpoint URL)

  • Espace de nom de la méthode de service (URI du namespace de méthode)

  • Nom de la méthode de service et informations sur les paramètres

Nous allons maintenant créer étape par étape le client SOAP pour appeler les méthodes SOAP suivantes : add, div :

Étape 1 - Créer un exemple de SOAP Driver

Nous pouvons appeler le nouveau méthode de la classe SOAP::RPC::Driver en la créant par exemple, comme suit :

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

Voici la description des paramètres :

ParamètresDescription
endPointAdresse URL du service SOAP
nameSpaceL'espace de nom pour tous les RPC de l'objet SOAP::RPC::Driver.
soapActionValeur du champ SOAPAction pour l'en-tête HTTP. Si c'est une chaîne vide "", il est par défaut nil

Étape 2 - Ajouter la méthode de service

Pour ajouter une méthode de service SOAP à SOAP::RPC::Driver, nous pouvons appeler la méthode suivante par exemple SOAP::RPC::Driver :

driver.add_method(name, *paramArg)

Voici la description des paramètres :

ParamètresDescription
nomNom de la méthode du service web distant
paramArgSpécifier les paramètres du programme distant

Étape 3 - Appel de service SOAP

Nous pouvons utiliser l'exemple SOAP::RPC::Driver pour appeler le service SOAP :

result = driver.serviceMethod(paramArg...)

serviceMethod est le nom réel de la méthode du service SOAP, paramArg est la liste des arguments de la méthode.

Exemple en ligne

Sur la base des étapes ci-dessus, nous pouvons écrire le client SOAP suivant :

Exemple en ligne

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

Nous avons simplement introduit le Web Service Ruby dans cet article. Si vous souhaitez en savoir plus, vous pouvez consulter la documentation officielle :Web Service Ruby