Rails – Usando la interfaz SOAP de otra aplicación

Tengo una aplicación de Rails pura y funcional.

Ahora lo necesito para comenzar a comunicarme con otra aplicación ( sympa ). Esta aplicación expone que expone una interfaz SOAP , por lo que tiene sentido que intente usarla (la interfaz de línea de comandos está incompleta).

¿Qué pasos debo seguir?

¿Qué gems / complementos debo usar?

¿Alguien tiene tutoriales / ejemplos de trabajo?

Estoy más o menos familiarizado con los conceptos generales de SOAP, pero nunca antes he usado SOAP. Entiendo REST.

EDIT: esta es una fecha de respuesta desactualizada de Rails 2.x. Para una respuesta más actual, te recomiendo que veas railscast # 290 . Dejo esta respuesta aquí en caso de que alguien siga usando los Rails 2.x por alguna razón, y no pueda aplicar lo que Ryan Bates dice allí.

He estado luchando con esto por algunos días y creo que encontré una solución yo mismo.

La gem más simple y más activa que pude encontrar para la interacción SOAP se llama Savon .

Se supone que funciona con el propio Ruby. Aquí hay un recorrido rápido sobre cómo lo usa con Rails:

Instala la gem. La forma más fácil es editar config / environment y agregar

config.gem "savon" 

Y luego correr

 rake gems:install 

Esto debería instalar Savon junto con un par de gems más.

A continuación, cree una clase en su app/models/ directorio (no tiene que ser una subclase de ActiveRecord, solo una clase regular en su directorio de modelos)

Si eres como yo, querrás permanecer lo más alejado posible de XML. Puedes hacerlo creando una clase como esta:

 class MyWebservice WSDL = "http://www.theWebSiteWithAService.com/wsdl" def self.client @@client ||= Savon::Client.new(WSDL) end def self.soap_actions return client.wsdl.soap_actions end def self.invoke(action, parameters) response = client.send(action) { |soap| soap.body = parameters } return response.to_hash end end 

Lo usarás principalmente para invocar métodos. El tipo de métodos que podrá invocar depende de los servicios que proporciona “el otro sitio”. Imaginemos que hay 3 acciones disponibles :create_monkey:create_monkey :destroy_monkey & :list_monkeys . Puede confirmar que la lista es correcta haciendo esto en la consola de los Rails:

 MyWebservice.soap_actions => [:create_monkey, :destroy_monkey, :list_monkeys] 

Ahora imagina que quieres invocar: create_monkey. Primero necesita saber qué parámetros son necesarios para esa llamada. El mejor lugar para ver esto es el propio archivo wsdl. Debería ver algo como esto:

        

Así que toma dos parámetros: name y hair_color . En la consola ruby, puedes invocarla así:

 MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' } => {:status => 'ok'} 

Obtendrá un hash como respuesta. En este caso, obtuve el estado “ok”, pero podría ser mucho más complejo.

Más adelante, puede crear (por ejemplo) un modelo sin tablas llamado Monkey , y definir métodos como new , create , etc. que utilizan el servicio web.

Estoy dejando de lado muchas cosas interesantes, como la seguridad. Pero esto debería ayudarte a comenzar si tienes el mismo problema que yo tuve.

¡Saludos!

    Intereting Posts