Aplicación Ruby Web Service - SOAP4R


¿Qué es SOAP?

El Protocolo Simple de Acceso a Objetos (SOAP, por sus siglas en inglés Simple Object Access Protocol) es una especificación de protocolo para el intercambio de datos.

SOAP es un protocolo simple basado en XML que permite a las aplicaciones intercambiar información a través de HTTP.

El Protocolo Simple de Acceso a Objetos es una especificación de protocolo para el intercambio de datos; es un protocolo ligero, simple y basado en XML (un subconjunto del Lenguaje de Marcado Generalizado Estándar), diseñado para intercambiar información estructurada y fija en la WEB.

Para más tutoriales sobre SOAP, consulta:http://www.w3cschool.cc/soap/soap-tutorial.html。


Instalación de SOAP4R

SOAP4R fue desarrollado e implementado por Hiroshi Nakamura para aplicaciones SOAP en Ruby.

Dirección de descarga de SOAP4R:http://raa.ruby-lang.org/project/soap4r/。

Nota:Es posible que tu entorno Ruby ya tenga instalado este componente.

En el entorno Linux, también puedes usar gem para instalar este componente, el comando es el siguiente:

gem install soap4r --include-dependencies

Si desarrollas en un entorno Windows, necesitas descargar el archivo comprimido zip e instalarlo ejecutando install.rb.


Servicios SOAP4R

SOAP4R admite dos tipos diferentes de servicios:

  • Servicios basados en CGI/FastCGI (SOAP::RPC::CGIStub)
  • Servicio independiente (SOAP::RPC:StandaloneServer)

Este tutorial le mostrará cómo crear un servicio SOAP independiente. Los pasos son los siguientes:

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

Para implementar tu propio servidor independiente, necesitas escribir una nueva clase que sea subclase de SOAP::RPC::StandaloneServer:

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

Nota:Si vas a escribir un servidor basado en FastCGI, entonces necesitas heredar de la clase SOAP::RPC::CGIStub; el resto del programa permanecerá igual.

Paso 2 - Definir los métodos de manejo

A continuación definimos los métodos del Web Service; como se muestra, definimos dos métodos: uno suma dos números y el otro divide dos números:

class MyServer < SOAP::RPC::StandaloneServer ............... #Métodos de manejo def add(a, b) return a + b end def div(a, b) return a / b end end

Paso 3 - Publicar los métodos de manejo

A continuación, agrega los métodos que definimos en el servidor; el método initialize es público y se utiliza para la conexión externa:

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

A continuación se explica cada parámetro:

ParámetroDescripción
receiverEl objeto del método que contiene el nombre del método. Si defines los métodos de servicio en la misma clase, este parámetro esself。
methodNameEl nombre del método para la llamada de solicitud RPC.
paramArgNombres de parámetros y modos de parámetros

Para entenderinoutyoutlos parámetros, considera el siguiente método de servicio, que requiere dos parámetros de entrada: inParam e inoutParam; una vez que la función se haya ejecutado, devuelve tres valores: retVal, inoutParam y outParam:

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

El método de llamada público es el siguiente:

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

Paso 4 - Iniciar el servicio

Finalmente, instanciamos la clase derivada y llamamos al método start para iniciar el servicio:

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

A continuación se explican los parámetros de la solicitud:

ParámetroDescripción
ServerNameEl nombre del servicio; puedes ponerle el que prefieras.
urn:ruby:ServiceNameHere urn:rubyes fijo, pero puedes darle a tu servicio un nombre único.ServiceName
hostnameEspecifica el nombre del host
portPuerto del servicio web

Ejemplo

A continuación, siguiendo los pasos anteriores, creamos un servicio independiente:

Ejemplo

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

Después de ejecutar el programa anterior, se inicia un servicio local que escucha en el puerto 8080 y expone dos métodos: add y div.

Puedes ejecutar el servicio anterior en segundo plano:

$ ruby MyServer.rb &

Cliente SOAP4R

En Ruby se utiliza la clase SOAP::RPC::Driver para desarrollar clientes SOAP. A continuación, veremos en detalle el uso de la clase SOAP::RPC::Driver.

Para llamar a un servicio SOAP se necesita la siguiente información:

  • Dirección URL del servicio SOAP (SOAP Endpoint URL)
  • Espacio de nombres del método de servicio (Method Namespace URI)
  • Nombre del método de servicio e información de los parámetros

A continuación, crearemos paso a paso un cliente SOAP para llamar a los métodos SOAP anteriores: add y div:

Paso 1 - Crear una instancia de SOAP Driver

Podemos instanciar la clase SOAP::RPC::Driver para llamar a su nuevo método, como se muestra a continuación:

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

A continuación se describen los parámetros:

ParámetroDescripción
endPointDirección URL para conectarse al servicio SOAP
nameSpaceEl espacio de nombres se utiliza para todas las RPC del objeto SOAP::RPC::Driver.
soapActionValor del campo SOAPAction para la cabecera HTTP. Si la cadena es "", por defecto esnil

Paso 2 - Agregar métodos de servicio

Para agregar métodos de servicio SOAP a SOAP::RPC::Driver, podemos llamar al siguiente método mediante una instancia de SOAP::RPC::Driver:

driver.add_method(name, *paramArg)

A continuación se explican los parámetros:

ParámetroDescripción
nameEl nombre del método del servicio web remoto
paramArgEspecifica los parámetros del programa remoto

Paso 3 - Llamar al servicio SOAP

Finalmente, podemos usar una instancia de SOAP::RPC::Driver para llamar al servicio SOAP:

result = driver.serviceMethod(paramArg...)

serviceMethod es el nombre real del método del servicio SOAP, y paramArg es la lista de parámetros del método.

Ejemplo

Basándonos en los pasos anteriores, podemos escribir el siguiente cliente SOAP:

Ejemplo

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

Arriba solo hemos hecho una breve introducción al Web Service de Ruby. Si deseas obtener más información, puedes consultar la documentación oficial:Web Service de Ruby

Otras extensiones