РЕДАКТИРОВАТЬ: это устаревший ответ датировки рельсов 2.x. Для более актуального ответа я рекомендую посмотреть railscast # 290 . Я оставляю этот ответ здесь на тот случай, если кто-то по какой-то причине все еще использует rails 2.x и не может применить то, что там говорит Райан Бейтс.
Я борюсь с этим уже несколько дней и думаю, что нашел решение сам.
Самый простой, самый активный камень, который я смог найти для взаимодействия с SOAP, называется Savon .
Он должен работать с самим Руби. Вот краткий обзор того, как вы используете его с Rails:
Установите драгоценный камень. Самый простой способ - отредактировать config / environment и добавить
config.gem "savon"
А потом запустить
rake gems:install
Это должно установить savon вместе с еще парой драгоценных камней.
Затем создайте класс в каталоге app/models/
(он не должен быть подклассом ActiveRecord, просто обычный класс в каталоге моделей)
Если вы похожи на меня, вам захочется держаться как можно дальше от XML. Вы можете сделать это, создав такой класс:
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
Вы будете в основном использовать его для вызова методов. Тип методов, которые вы сможете использовать, зависит от услуг, предоставляемых «другим сайтом». Давайте представим, что доступно 3 действия - :create_monkey
, :destroy_monkey
& :list_monkeys
. Вы можете подтвердить правильность списка, выполнив это на консоли rails:
MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
Теперь представьте, что вы хотите вызвать: create_monkey. Для начала вам необходимо узнать, какие параметры необходимы для этого вызова. Лучше всего на это посмотреть сам файл wsdl. Вы должны увидеть что-то вроде этого:
<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>
Таким образом, он принимает два параметра: name
и hair_color
. На консоли ruby вы можете вызвать ее так:
MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
Вы получите хеш в ответ. В этом случае я получил статус «ОК», но это может быть гораздо сложнее.
Позже вы можете создать (например) модель без таблицы с именем Monkey
и определить методы, такие как new
, create
и т. Д., Которые используют веб-сервис.
Я опускаю много интересных вещей, таких как безопасность. Но это должно помочь вам начать, если у вас возникла та же проблема, что и у меня.
Привет!