EDITAR: esta es una respuesta obsoleta que data de rails 2.x. Para una respuesta más actual, le recomiendo que vea railscast #290. Dejo esta respuesta aquí en caso de que alguien aún esté utilizando Rails 2.x por alguna razón, y no pueda aplicar lo que Ryan Bates dice allí.
He estado luchando con esto durante algunos días y creo que encontré una solución.
La joya más simple y activa que pude encontrar para la interacción SOAP se llama Savon.
Se supone que funciona con Ruby. Aquí hay un recorrido rápido sobre cómo usarlo con Rails:
Instale la gema. La manera más fácil es editar config/medio ambiente y añadir
config.gem "savon"
y luego ejecutar
rake gems:install
Esto se debe instalar Savon junto con un par de piedras preciosas más.
A continuación, cree una clase en su directorio app/models/
(que no tiene por qué ser una subclase de ActiveRecord, sólo una clase regular en el directorio de modelos)
Si usted es como yo, tendrá que permanecer tan lejos de XML como sea posible. Puede hacerlo mediante la creación de una clase como ésta:
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
Va a ser en su mayoría utilizando para invocar métodos. El tipo de métodos que podrá invocar depende de los servicios que brinda el "otro sitio". Imaginemos que hay 3 acciones disponibles: :create_monkey
, :destroy_monkey
& :list_monkeys
. Puede confirmar que la lista es correcta al hacer esto en la consola rieles:
MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
Ahora imaginemos que desea invocar: create_monkey. Primero necesita saber qué parámetros son necesarios para esa llamada. El mejor lugar para mirar esto es el archivo wsdl en sí. Debería ver algo como esto:
<message name="create_monkey_request">
<part name="name" type="xsd:string"/>
<part name="hair_color" type="xsd:string"/>
</message>
<message name="create_monkey_response">
<part name="status" type="xsd:string"/>
</message>
por lo que toma dos parámetros: name
y hair_color
.En la consola ruby, puede invocarlo 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 tarde, puede crear (por ejemplo) una llamada tableless modelMonkey
, 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 comenzar si tienes el mismo problema que tuve.
¡Recuerdos!