EDYCJA: jest to nieaktualna datownik odpowiedzi z szyn 2.x. Aby uzyskać bardziej aktualną odpowiedź, polecam obejrzeć railscast #290. Pozostawię tę odpowiedź tutaj, na wypadek gdyby ktoś z jakiegoś powodu nadal korzystał z szyn 2.x i nie mógł zastosować tego, co mówi tam Ryan Bates.
Walczę z tym od kilku dni i myślę, że sam znalazłem rozwiązanie.
Najprostszym, najbardziej aktywnym klejnotem, jaki udało mi się znaleźć dla interakcji SOAP, jest Savon.
Ma działać z samą Ruby. Oto krótka prezentacja dotycząca korzystania z Railsów:
Zainstaluj klejnot. Najłatwiej jest zmienić config/środowiska i dodać
config.gem "savon"
A następnie uruchomić
rake gems:install
Należy zainstalować Savon wraz z kilkoma więcej kamieni.
Następnie należy utworzyć klasę o katalogu app/models/
(to nie musi być podklasą ActiveRecord, po prostu zwykła klasa na swoim katalogu modelach)
Jeśli jesteś podobny do mnie, będziemy chcieli, aby zatrzymać tak daleko od XML, jak to możliwe. Możesz to zrobić, tworząc klasę podobną do tej:
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
Będziesz głównie używać jej do wywoływania metod. Rodzaj metod, które będziesz mógł wywołać, zależy od usług oferowanych przez "inną witrynę". Wyobraźmy sobie, że dostępne są 3 akcje - :create_monkey
, :destroy_monkey
& :list_monkeys
. Można potwierdzić, że lista jest poprawna robiąc to na konsoli szyn:
MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
Teraz wyobraź sobie, że chcesz wywołać: create_monkey. Najpierw musisz wiedzieć, jakie parametry są potrzebne do tego połączenia. Najlepiej przyjrzeć się temu samemu plikowi wsdl. Powinieneś zobaczyć coś takiego:
<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>
więc zajmuje dwa parametry: name
i hair_color
.Na konsoli ruby możesz wywołać ją tak:
MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
Otrzymasz hasz w odpowiedzi. W tym przypadku uzyskałem status "ok", ale może być znacznie bardziej skomplikowany.
Później można utworzyć (na przykład) tableless model zwanego Monkey
i zdefiniować metody jak new
, create
, etc, które wykorzystują usługa.
Zostawiam wiele interesujących rzeczy, takich jak bezpieczeństwo. Ale to powinno ci zacząć, jeśli masz ten sam problem, który miałem.
Pozdrawiam!