Servicios web con Ruby - SOAP4R

¿Qué es SOAP?

El Protocolo simple de acceso a objetos (SOAP) es un protocolo RPC multiplataforma e independiente del lenguaje basado en XML y, generalmente (pero no necesariamente) HTTP.

Utiliza XML para codificar la información que realiza la llamada al procedimiento remoto y HTTP para transportar esa información a través de una red desde los clientes a los servidores y viceversa.

SOAP tiene varias ventajas sobre otras tecnologías como COM, CORBA, etc.: por ejemplo, sus costos de implementación y depuración relativamente económicos, su extensibilidad y facilidad de uso, y la existencia de varias implementaciones para diferentes lenguajes y plataformas.

Consulte nuestro sencillo tutorial SOAP para comprenderlo en detalle.

Este capítulo lo familiariza con la implementación de SOAP para Ruby (SOAP4R). Este es un tutorial básico, por lo que si necesita un detalle profundo, deberá consultar otros recursos.

Instalación de SOAP4R

SOAP4R es la implementación SOAP para Ruby desarrollada por Hiroshi Nakamura y se puede descargar desde:

NOTE - Puede haber una gran posibilidad de que ya haya instalado este componente.

Download SOAP

Si es consciente de gem utilidad, entonces puede usar el siguiente comando para instalar SOAP4R y paquetes relacionados.

$ gem install soap4r --include-dependencies

Si está trabajando en Windows, debe descargar un archivo comprimido desde la ubicación anterior y debe instalarlo utilizando el método de instalación estándar ejecutando ruby install.rb .

Escribir servidores SOAP4R

SOAP4R admite dos tipos diferentes de servidores:

  • Basado en CGI / FastCGI (SOAP :: RPC :: CGIStub)
  • Independiente (SOAP :: RPC: StandaloneServer)

Este capítulo brinda detalles sobre cómo escribir un servidor independiente. Los siguientes pasos están involucrados en la escritura de un servidor SOAP.

Paso 1 - Heredar SOAP :: RPC :: StandaloneServer Class

Para implementar su propio servidor independiente, debe escribir una nueva clase, que será hija de SOAP :: StandaloneServer de la siguiente manera:

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

NOTE- Si desea escribir un servidor basado en FastCGI, debe tomar SOAP :: RPC :: CGIStub como clase principal, el resto del procedimiento seguirá siendo el mismo.

Paso 2: definir los métodos del controlador

El segundo paso es escribir sus métodos de servicios web, que le gustaría exponer al mundo exterior.

Se pueden escribir como métodos simples de Ruby. Por ejemplo, escriba dos métodos para sumar dos números y dividir dos números:

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

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

Paso 3: exponer los métodos del controlador

El siguiente paso es agregar nuestros métodos definidos a nuestro servidor. El método de inicialización se utiliza para exponer los métodos de servicio con uno de los dos métodos siguientes:

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

Aquí está la descripción de los parámetros:

No Señor. Descripción de parámetros
1

receiver

El objeto que contiene el método methodName. Usted define los métodos de servicio en la misma clase que el método methodDef, este parámetro es self .

2

methodName

El nombre del método que se llama debido a una solicitud RPC.

3

paramArg

Especifica, cuando se dan, los nombres de los parámetros y los modos de los parámetros.

Para comprender el uso de los parámetros inout o out , considere el siguiente método de servicio que toma dos parámetros (inParam e inoutParam), devuelve un valor de retorno normal (retVal) y dos parámetros más: inoutParam y outParam -

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

Ahora, podemos exponer este método de la siguiente manera:

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

Paso 4: inicie el servidor

El último paso es iniciar su servidor creando una instancia de la clase derivada y llamando start método.

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

myServer.start

Aquí está la descripción de los parámetros requeridos:

No Señor. Descripción de parámetros
1

ServerName

Un nombre de servidor, puedes dar lo que más te guste.

2

urn:ruby:ServiceName

Aquí urn: ruby es constante, pero puede dar un nombre ServiceName único para este servidor.

3

hostname

Especifica el nombre de host en el que escuchará este servidor.

4

port

Un número de puerto disponible que se utilizará para el servicio web.

Ejemplo

Ahora, siguiendo los pasos anteriores, escribamos un servidor independiente:

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

Cuando se ejecuta, esta aplicación de servidor inicia un servidor SOAP independiente en localhost y escucha las solicitudes en el puerto 8080. Expone un método de servicio, add y div , que toma dos parámetros y devuelve el resultado.

Ahora, puede ejecutar este servidor en segundo plano de la siguiente manera:

$ ruby MyServer.rb&

Escribir clientes SOAP4R

La clase SOAP :: RPC :: Driver proporciona soporte para escribir aplicaciones cliente SOAP. Este capítulo describe esta clase y demuestra su uso sobre la base de una aplicación.

A continuación se muestra la información mínima que necesitaría para llamar a un servicio SOAP:

  • La URL del servicio SOAP (SOAP Endpoint URL).
  • El espacio de nombres de los métodos de servicio (URI del espacio de nombres del método).
  • Los nombres de los métodos de servicio y sus parámetros.

Ahora, escribiremos un cliente SOAP que llamaría a los métodos de servicio definidos en el ejemplo anterior, llamado add y div .

Estos son los pasos principales para crear un cliente SOAP.

Paso 1: crear una instancia de controlador SOAP

Creamos una instancia de SOAP :: RPC :: Driver llamando a su nuevo método de la siguiente manera:

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

Aquí está la descripción de los parámetros requeridos:

No Señor. Descripción de parámetros
1

endPoint

URL del servidor SOAP con el que conectarse.

2

nameSpace

El espacio de nombres que se utilizará para todas las RPC realizadas con este objeto SOAP :: RPC :: Driver.

3

soapAction

Un valor para el campo SOAPAction del encabezado HTTP. Si es nulo, el valor predeterminado es la cadena vacía "".

Paso 2: agregar métodos de servicio

Para agregar un método de servicio SOAP a SOAP :: RPC :: Driver , podemos llamar al siguiente método usando SOAP :: RPC :: instancia de Driver -

driver.add_method(name, *paramArg)

Aquí está la descripción de los parámetros:

No Señor. Descripción de parámetros
1

name

El nombre del método de servicio web remoto.

2

paramArg

Especifica los nombres de los parámetros de los procedimientos remotos.

Paso 3: invocar el servicio SOAP

El último paso es facturar el servicio SOAP utilizando la instancia SOAP :: RPC :: Driver de la siguiente manera:

result = driver.serviceMethod(paramArg...)

Aquí serviceMethod es el método de servicio web real y paramArg ... es la lista de parámetros necesarios para pasar el método de servicio.

Example

Según los pasos anteriores, escribiremos un cliente SOAP de la siguiente manera:

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

Lecturas adicionales

Le he explicado conceptos muy básicos de los servicios web con Ruby. Si desea profundizar más, existe el siguiente enlace para encontrar más detalles sobre los servicios web con Ruby .