Rails - Usando a interface SOAP de outro aplicativo
-
23-09-2019 - |
Pergunta
Eu tenho uma aplicação pura e trabalhadora de Rails.
Agora preciso disso para começar a se comunicar com outro aplicativo (Sympa). Este aplicativo expõe que expõe um Interface de sabão, então faz sentido que eu tento usá -lo (a interface da linha de comando está incompleta).
Quais etapas devo seguir?
Quais gems/plugins devo usar?
Alguém tem tutoriais / exemplos de trabalho?
Estou mais ou menos familiarizado com os conceitos gerais de sabão, mas nunca usei sabão antes. Eu entendo descanso.
Solução
EDIT: Esta é uma resposta desatualizada datada de trilhos 2.x. Para uma resposta mais presente, eu recomendo que você assista Railscast #290 . Estou deixando esta resposta aqui, caso alguém ainda esteja usando o Rails 2.x por algum motivo e não possa aplicar o que Ryan Bates diz lá.
Estou lutando com isso há alguns dias e acho que encontrei uma solução.
A jóia mais simples e ativa que eu pude encontrar para a interação SOAP é chamada Savon.
Deveria trabalhar com o próprio Ruby. Aqui está um rápido tour sobre como você o usa com o Rails:
Instale a gema. A maneira mais fácil é editar configuração/ambiente e adicionar
config.gem "savon"
E depois corra
rake gems:install
Isso deve instalar o Savon junto com mais algumas jóias.
Em seguida, crie uma aula em seu app/models/
Diretório (não precisa ser uma subclasse do ActiveRecord, apenas uma aula regular no diretório de modelos)
Se você é como eu, você vai querer ficar o mais longe possível do XML. Você pode fazer isso criando uma aula 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
Você o usará principalmente para chamar métodos. O tipo de método que você poderá invocar depende dos serviços que "o outro site" fornece. Vamos imaginar que três ações estão disponíveis - :create_monkey
, :destroy_monkey
& :list_monkeys
. Você pode confirmar que a lista está correta ao fazer isso no console do Rails:
MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
Agora imagine que você deseja invocar: create_monkey. Primeiro, você precisa saber quais parâmetros são necessários para essa chamada. O melhor lugar para olhar para isso é o próprio arquivo WSDL. Você deve ver algo assim:
<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>
Então, são necessários dois parâmetros: name
e hair_color
. No console do rubi, você pode invocar assim:
MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
Você receberá um hash como resposta. Nesse caso, obtive um status de 'OK', mas pode ser muito mais complexo.
Mais tarde, você pode criar (por exemplo) um Modelo sem mesa chamado Monkey
, e definir métodos como new
, create
, etc que usam o serviço da web.
Estou deixando de fora muitas coisas interessantes, como a segurança. Mas isso deve começar, se tiver o mesmo problema que eu tive.
Cumprimentos!