Carriles - Usando interfaz SOAP de otra aplicación
-
23-09-2019 - |
Pregunta
Tengo un, trabajo, pura aplicación Rails.
Ahora se necesita para empezar a comunicarse con otra aplicación ( sympa ). Esta aplicación expone que expone un interfaz SOAP , así que tiene sentido que yo trato de usarlo (el interfaz de línea de comandos es incompleta).
¿Qué pasos debo seguir?
¿Qué gemas / plugins deben usar?
¿alguien tiene tutoriales de trabajo / ejemplos?
Estoy más o menos familiarizados con los conceptos generales jabón, pero nunca he usado jabón antes. Entiendo RESTO.
Solución
EDIT: esta es una respuesta obsoleta que data de los carriles 2.x. Para una respuesta más presente, se lo recomiendo a ver Railscast # 290 . Me voy de esta respuesta aquí por si alguien todavía está utilizando rieles 2.x por alguna razón, y no se puede aplicar lo que Ryan Bates dice allí.
He estado luchando con esto durante algunos días y creo que he encontrado una solución a mí mismo.
El más simple, la gema más activo que he podido encontrar para la interacción de SOAP se llama Savon .
Se supone que el trabajo con la propia Ruby. He aquí un rápido recorrido sobre cómo se utiliza con rieles:
Instalar la gema. Lo más fácil es editar config / medio ambiente y complemento
config.gem "savon"
Y a continuación, ejecute
rake gems:install
Esto 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 sus modelos de directorio)
Si usted es como yo, tendrá que permanecer lo más lejos posible de XML. 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
será principalmente usarlo para invocar métodos. El tipo de métodos usted será capaz de invocar depende de los servicios que "el otro sitio" proporciona. Imaginemos que 3 acciones están disponibles - :create_monkey
, :destroy_monkey
y :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 imagine que desea invocar: create_monkey. En primer lugar usted 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>
Así que toma dos parámetros: name
y hair_color
. En la consola de rubí, se puede invocar como esto:
MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
Se obtendrá un hash como respuesta. En este caso tengo una condición de 'bien', pero podría ser mucho más complejo.
Más tarde, puede crear (por ejemplo) un modelo sin tablas llama Monkey
y definir métodos como new
, create
, etc que utilizan el servicio web.
Me voy a cabo un montón de cosas interesantes, como la seguridad. Pero esto debe ir abriendo boca si tiene el mismo problema que tuve.
Saludos!