2010-01-27 8 views
7

Tengo una aplicación Rails pura y funcional.Rieles: utilizando la interfaz SOAP de otra aplicación

Ahora necesito que comience a comunicarse con otra aplicación (sympa). Esta aplicación expone que expone un SOAP interface, por lo que tiene sentido que trate de usarlo (la interfaz de línea de comandos está incompleta).

¿Qué pasos debo seguir?

¿Qué gemas/complementos debo usar?

¿Alguien tiene tutoriales/ejemplos que funcionen?

Estoy más o menos familiarizado con los conceptos generales de SOAP, pero nunca antes había usado SOAP. Entiendo DESCANSO.

Respuesta

11

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!

Cuestiones relacionadas