2010-01-27 16 views
7

Mam czystą, działającą aplikację Rails.Szyny - Korzystanie z interfejsu SOAP innej aplikacji

Potrzebuję go teraz, aby rozpocząć komunikację z inną aplikacją (sympa). Ta aplikacja ujawnia, że ​​eksponuje SOAP interface, więc ma sens, że próbuję go użyć (interfejs wiersza poleceń jest niekompletny).

Jakie kroki należy wykonać?

Jakie klejnoty/wtyczki powinienem użyć?

Czy ktoś ma działające samouczki/przykłady?

Jestem mniej lub bardziej zaznajomiony z ogólnymi koncepcjami SOAP, ale nigdy wcześniej nie używałam SOAP. Rozumiem REST.

Odpowiedz

11

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!

Powiązane problemy